当前位置: 代码网 > it编程>编程语言>Java > Java文件分级目录打包下载zip的实例代码

Java文件分级目录打包下载zip的实例代码

2024年08月26日 Java 我要评论
java文件分级目录打包下载zip说一下具体实现的功能吧,要将页面的文件存放在对应的文件目录,打成压缩包下载。由于第一次接触,也是找了一整天网上的方法,费尽脑汁,终于实现了。打包下载zip的工具类直接

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);
    }

这是页面文件的展示页

点击下载即可打包文件,下载压缩包。

下载成功的展示

解压后的文件

总结

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com