JAVAでファイルをZIP圧縮する †java.util.zip パッケージを使用してファイルをZIP圧縮する package test_java;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.zip.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestZip extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String zipFileDir = "/home/hoge";
String zipFileName = "files.zip";
String zipFilePath = zipFileDir + "/" + zipFileName;
String[] targetFiles = {"/home/hoge/file1.txt","/home/hoge/file2.txt","/home/hoge/file3.txt"};
OutputStream out = null;
FileInputStream in = null;
try {
// ZIPファイルの作成
createZip(zipFilePath , targetFiles);
// ファイル名のエンコード
zipFileName = encodeFileName(zipFileName);
// ZIPファイルのダウンロード
response.setContentType("application/octet-stream; charset=\"Windows-31J\"");
response.setHeader("Content-Disposition", "attachment; filename=\""+ zipFileName + "\"");
out = response.getOutputStream();
in = new FileInputStream(zipFilePath);
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} catch (IOException e) {
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
if (in != null) {
try {
in.close();
in = null;
} catch (IOException e) {
}
}
}
// 作業用ファイルを削除
try {
(new File(zipFilePath)).delete();
for (int i = 0; i < targetFiles.length; i++) {
(new File(targetFiles[i])).delete();
}
} catch (Exception e){
}
}
/**
* targetFilesをZIP圧縮してzipFileに出力する。
* @param zipFile ZIP出力ファイル名
* @param targetFiles 入力ファイル名(ディレクトリ)配列
* @throws IOException 入出力例外
*/
public static void createZip(String zipFile, String[] targetFiles)
throws IOException {
ZipOutputStream out =
new ZipOutputStream(new FileOutputStream(zipFile));
for (int i = 0; i < targetFiles.length; i++) {
File file = new File(targetFiles[i]);
int deleteLength = file.getPath().length() - file.getName().length();
createZip(out, file, deleteLength);
}
out.close();
}
/**
* targetFileをoutのZIPエントリへ出力する。
* @param out ZIP出力先
* @param targetFile 入力ファイル名(ディレクトリ)
* @throws IOException 入出力例外
*/
private static void createZip(ZipOutputStream out, File targetFile, int deleteLength)
throws IOException {
if (targetFile.isDirectory()) {
File[] files = targetFile.listFiles();
for (int i = 0; i < files.length; i++) {
createZip(out, files[i], deleteLength);
}
} else {
ZipEntry target = new ZipEntry(getEntryPath(targetFile, deleteLength));
out.putNextEntry(target);
byte buf[] = new byte[1024];
int count;
BufferedInputStream in =
new BufferedInputStream(new FileInputStream(targetFile));
while ((count = in.read(buf, 0, 1024)) != -1) {
out.write(buf, 0, count);
}
in.close();
out.closeEntry();
in = null;
out = null;
}
}
/**
* ZIPエントリパスを返す。
* @param file ZIPエントリ対象ファイル
* @return ZIPエントリのパス
*/
private static String getEntryPath(File file, int deleteLength) {
return file.getPath().replaceAll("\\\\", "/").substring(deleteLength);
}
/**
* ファイル名をURLエンコードする
* @param fileName
* @return エンコードされたファイル名
*/
private String encodeFileName(String fileName) {
try {
fileName = new String(fileName.getBytes("Shift_JIS"), "ISO-8859-1");
} catch (UnsupportedEncodingException e){
}
return fileName;
}
}
|