java文件分级目录打包下载zip
说一下具体实现的功能吧,要将页面的文件存放在对应的文件目录,打成压缩包下载。
由于第一次接触,也是找了一整天网上的方法,费尽脑汁,终于实现了。
打包下载zip的工具类
直接调用即可
import java.io.bufferedinputstream;
import java.io.bufferedoutputstream;
import java.io.bytearrayinputstream;
import java.io.bytearrayoutputstream;
import java.io.file;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.io.inputstream;
import java.util.arraylist;
import java.util.enumeration;
import java.util.list;
import org.apache.commons.codec.binary.base64;
import org.apache.commons.collections.collectionutils;
import org.apache.tools.zip.zipentry;
import org.apache.tools.zip.zipfile;
import org.apache.tools.zip.zipoutputstream;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
/**
* @author: fd
* @date 2020/7/28 21:33
* @description:
*/
public class ziputiles {
private static logger logger = loggerfactory.getlogger(ziputiles.class);
// 目录标识判断符
private static final string patch = "/";
// 基目录
private static final string base_dir = "/b/";
// 缓冲区大小
private static final int buffer = 2048;
// 字符集
private static final string char_set = "utf-8";
public static void compress(file srcfile, zipoutputstream zipoutputstream, string basepath) throws exception {
if (srcfile.isdirectory()) {
compressdir(srcfile, zipoutputstream, basepath);
} else {
compressfile(srcfile, zipoutputstream, basepath);
}
}
private static void compressdir(file dir, zipoutputstream zipoutputstream, string basepath) throws exception {
try {
// 获取文件列表
file[] files = dir.listfiles();
if (files.length < 1) {
zipentry zipentry = new zipentry(basepath + dir.getname() + patch);
zipoutputstream.putnextentry(zipentry);
zipoutputstream.closeentry();
}
for (int i = 0,size = files.length; i < size; i++) {
compress(files[i], zipoutputstream, basepath + dir.getname() + patch);
}
} catch (exception e) {
throw new exception(e.getmessage(), e);
}
}
private static void compressfile(file file, zipoutputstream zipoutputstream, string dir) throws exception {
try {
// 压缩文件
zipentry zipentry = new zipentry(dir + file.getname());
zipoutputstream.putnextentry(zipentry);
// 读取文件
bufferedinputstream bis = new bufferedinputstream(new fileinputstream(file));
int count = 0;
byte data[] = new byte[buffer];
while ((count = bis.read(data, 0, buffer)) != -1) {
zipoutputstream.write(data, 0, count);
}
bis.close();
zipoutputstream.closeentry();
} catch (exception e) {
throw new exception(e.getmessage(),e);
}
}
public static void main(string[] args) {
try {
zipoutputstream zipoutputstream = new zipoutputstream(new fileoutputstream(new file("d:/a/a.zip")));
zipoutputstream.setencoding(char_set);
list<file> files = new arraylist<file>();
files.add(new file("d:\\a\\b\\1.jpg"));
files.add(new file("d:\\a\\b\\2.jfif"));
if (collectionutils.isempty(files) == false) {
for (int i = 0,size = files.size(); i < size; i++) {
compress(files.get(i), zipoutputstream, base_dir);
}
}
// 冲刷输出流
zipoutputstream.flush();
// 关闭输出流
zipoutputstream.close();
} catch (exception e) {
e.printstacktrace();
}
}
}页面下载方法的接口
业务逻辑可跟需求修改,这里主要是查询数据库得出文件名,根据自己需求构建分级文件名,存入集合,循环将对应的文件存放到文件夹里,调用工具类打成压缩包下载。
/**
* 打包下载
*/
@requestmapping(value = "/packdownload", method = requestmethod.get)
public void packdownload(httpsession session, httpservletrequest request, httpservletresponse response) {
printwriter outwriter = null;
try {
//查询条件
string loanid = request.getparameter("loanid")==null?"":request.getparameter("loanid").trim();
string contno = request.getparameter("contnostr")==null?"":request.getparameter("contnostr").trim();
criteria cri = new criteria();
cri.clear();
//业务需求 查询文件的条件
if(stringutils.isnotblank(loanid) && !loanid.equals("")){
cri.put("loanid",loanid);
}
//查询出来的文件集合
list<tfileconfig> tfileconfiglist = fileconfigservice.selectbycondition(cri);
if(tfileconfiglist != null && tfileconfiglist.size() > 0){
string zipname = contno + "信贷档案信息.zip";
response.setcontenttype("application/octet-stream");// 指明response的返回对象是文件流
response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode(zipname, "utf-8"));
zipoutputstream zipoutputstream = new zipoutputstream(new bufferedoutputstream(response.getoutputstream()));
zipoutputstream.setmethod(zipoutputstream.deflated);//设置压缩方法
try {
//以下代码为 根据自己所需条件查询数据库得出文件夹名 构建二级文件夹名
list<file> files = new arraylist<file>();
list<string> totalfolderlist = new arraylist<string>();
tfileconfig fileconfig = null;
for (int i = 0;i < tfileconfiglist.size(); i++){
fileconfig = tfileconfiglist.get(i);
cri.clear();
cri.put("loanconfigid",fileconfig.getloanconfigid());
list<tloanconfig> loanconfiglist = tloanconfigservice.selectbycondition(cri); //根据loanconfigid 查找对应 的 配置类名
if(loanconfiglist != null && loanconfiglist.size() > 0){
string foldername = loanconfiglist.get(0).getloanconfigname(); //子类文件名
cri.clear();
cri.put("superids",loanconfiglist.get(0).getsuperid());
list<tloanconfig> superconfiglist = tloanconfigservice.selectbycondition(cri);
if(superconfiglist != null && superconfiglist.size() > 0){
tloanconfig config = superconfiglist.get(0);
string superconfigname = config.getloanconfigname(); //父类文件夹名
totalfolderlist.add(superconfigname + "\\" + foldername + "\\"); //构建二级文件夹名
}
files.add(new file(fileconfig.getrealpath()));
}
}
if (collectionutils.isempty(files) == false) {
for (int i = 0,size = totalfolderlist.size(); i < size; i++) {
//调用工具类方法
ziputiles.compress(files.get(i), zipoutputstream, totalfolderlist.get(i));
}
response.flushbuffer();
// 冲刷输出流
zipoutputstream.flush();
zipoutputstream.finish();
// 关闭输出流
zipoutputstream.close();
} catch (exception e) {
e.printstacktrace();
}
}else{
outwriter = response.getwriter();
outwriter.println("<script>alert('该日期暂无文件')';</script>");
return;
}
} catch (exception e) {
try {
outwriter = response.getwriter();
} catch (ioexception e1) {
e1.printstacktrace();
}
logger.error("importfilecontroller.java-packdownload-exception: ", e);
outwriter.println("<script>alert('下载异常')';</script>");
return;
}
}页面下载调用后台接口
function subfrm(){
var options = {
datatype: 'json',
iframe: false,
resetform: true,
success: function(data) {
debugger;
if(data.code == 1){
layer.alert('校验成功', {icon: 1},function(index){
var url = pcs.common.path + '/admin/sysfiles/packdownload?loanid=' + $("#loanid").val() + "&contnostr=" + $("#contnostr").val();
window.location.href = url;
//关闭弹窗
settimeout(function () {
var index = parent.layer.getframeindex(window.name);
parent.layer.close(index);
}, 500)
});
}else{
layer.alert(data.msg, {icon: 2});
}
},
error:function(){
layer.alert('页面已过期,请刷新', {icon: 2},function(){
window.location.href = pcs.common.path + '/admin/user/confirmpwd';
});
}
};
$.ajaxsetup({contenttype:'application/x-www-form-urlencoded;charset=utf-8'});
$('#frm').ajaxsubmit(options);
}这是页面文件的展示页
点击下载即可打包文件,下载压缩包。

下载成功的展示

解压后的文件



总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论