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); }
这是页面文件的展示页
点击下载即可打包文件,下载压缩包。
下载成功的展示
解压后的文件
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论