使用ant.jar包的API进行文件夹打包。直接上代码:
String zipfilename = "test.zip";
File zipfile = new File(zipfilename);
org.apache.tools.ant.types.FileSet fileSet = new FileSet();
org.apache.tools.ant.Project prj = new Project();
org.apache.tools.ant.taskdefs.Zip zip = new Zip();
zip.setProject(prj);
zip.setDestFile(zipfile);
fileSet.setProject(prj);
fileSet.setDir(file); // 这里是文件路径的设置。
zip.addFileset(fileSet);
zip.execute();
HttpServletResponse response = super.currentResponse;
response.setHeader("Content-Type", "application/zip");
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zipfilename, "UTF-8"));
OutputStream os = response.getOutputStream();
InputStream is = new FileInputStream(zipfile);
DownloadUtil.transfer(is, os);
zipfile.delete();
如果在下载的时候,不希望下载文件路径下的所有文件,而是部分符合自己需求的文件的话。
下面这个例子,除了check了需求之外,还远端的文件进行了操作,利用ChannelSftp取得的连接,进行文件读入并下载。
如下:
private com.jcraft.jsch.ChannelSftp channel; // 这行是类成员变量
String zipfilename = getServerZipFileName(inputfilename);
if (channel == null || !channel.isConnected()) {
channel = SftpUtils.connect(sftpHost, Integer.parseInt(sftpPort), sftpUsername, sftpPassword);// 取得连接。
}
HttpServletResponse response = super.currentResponse;
try {
boolean isMultiFilesName = isMultiFilesName(inputfilename);
Vector vs = channel.ls(logfilepath);
if (vs.isEmpty()) {
return false;
} else {
response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zipfilename, "UTF-8"));
OutputStream out = response.getOutputStream();
java.util.zip.ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(out));
for (LsEntry entry : vs) {
if (entry.getAttrs().toString().startsWith("-")) {
String entryname = entry.getFilename();
if (isMultiFilesName && entryname.startsWith(inputfilename.substring(0, inputfilename.length() - 1))
&& !entryname.matches("^.*[\\*]+.*$") || entryname.equals(inputfilename)) { // 符合规则的文件才做输出处理
java.util.zip.ZipEntry zipentry = new ZipEntry(entryname);
zipOut.putNextEntry(zipentry);
InputStream bis = channel.get(logfilepath + entryname); // 这里要注意,目标目录下的文件名称,不能有*,不然这一步get方法的目标可能是多个文件而出错。
if (bis != null) {
int count = 0;
byte[] buffer = new byte[8192];
while ((count = bis.read(buffer)) > 0) {
zipOut.write(buffer, 0, count);
}
bis.close();
}
}
}
}
zipOut.close();
}
} catch (Exception e) {
response.reset();
e.printStackTrace();
return false;
} finally {
if (channel != null && !channel.isClosed()) {
channel.getSession().disconnect();
channel.disconnect();
}
}