java批量下载文件zip打包

实现思路:

1.首先你要会单个文件下载的写法,把文件写入到临时文件夹里.
//参考写法
  public static String createGyss(LawsuitInfo lawsuit, String fileName) {
  //读配置获取想要将文件下载的路径(算是临时目录,将数据传递给浏览器后这里保存的文件可以删除,也可以保留)
    String strWorkPath = AppConfig.get("file.work.path") + AppUtils.randomUUID() + "/";
    File file = new File(strWorkPath);
    OutputStream ops=null;
    try {
      //创建文件夹
      if(!file.exists()) {
        file.mkdir();
      }
      file = new File(strWorkPath + fileName);
      if (!file.exists()) {
        file.createNewFile();
      }
      ops = new FileOutputStream(file);
      //因为下载的是word,这个方法是渲染word格式的,详情见下方;这里采用的是XWPFDocument这个类来实现文件下载的,你如果下载的是别的类型的文件用自己的下载方式即可,只要把文件下载到指定目录并返回文件全路径即可
      XWPFDocument document = LawsuitDocUtils.createDocument(lawsuit);//lawsuit这个变量是文档需要用到的一些文字数据实体类.
      document.write(ops);
    } catch (Exception ex) {
      logger.error("生成word报表发生错误", ex);
    } finally {
      if (ops != null) {
        try {
          ops.flush();
          ops.close();
        } catch (IOException e) {
          logger.error("生成word报表发生错误", e);
        }
      }
    }

    return strWorkPath + fileName;//返回的是文件下载到的路径
  }
//这里就是把不规律的数据处理一下,渲染word格式的
public static XWPFDocument createDocument(LawsuitInfo lawsuitInfo) {
		XWPFDocument document = new XWPFDocument();
		// 正文
//		Map<String, Object> body = (Map<String, Object>) content.get("content");
		XWPFParagraph para = document.createParagraph();
		para.setAlignment(ParagraphAlignment.CENTER);
		XWPFRun run = para.createRun();
		run.setText(lawsuitInfo.getTitle());
		run.setFontFamily("宋体");
		run.setFontSize(15);
		run.setBold(true);
		run.addBreak();

		String account = delLawTag(lawsuitInfo.getAccount());
		if (account != null) {
			para.setAlignment(ParagraphAlignment.CENTER);
			run = para.createRun();
			run.setText("来源:"+account);
			run.setFontFamily("宋体");
			run.setFontSize(10);
			run.addBreak();
		}

		String content =  lawsuitInfo.getContent();
		if (content != null) {
			XWPFParagraph para2 = document.createParagraph();
			String[] split = content.split("\n");
			for (int i = 0; i < split.length; i++) {
				Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
				Matcher m = p.matcher(split[i]);
				if (m.find()){
					String trim = split[i].replaceAll(" ","");
					para2.setAlignment(ParagraphAlignment.LEFT);
					run = para2.createRun();
					run.setText("    "+trim);
					run.setFontFamily("宋体");
					run.setFontSize(15);
					run.addBreak();
				}
			}
		}

		return document;
	}
2.经过上面的循环,将文件写入指定文件夹,并且返还文件的全路径List集合.这样我们可以调用下面方法,去获取文件的字节数组.
//参考代码
public static byte[] batchCreate(List<String> files, String delDir) {
    String strWorkPath = AppConfig.get("file.work.path") + AppUtils.randomUUID() + "/";
    File workPath = new File(strWorkPath);
    if (!workPath.exists()) {
      workPath.mkdirs();
    }
	//FileUtils这个工具类详情见下方,AppUtils.randomUUID() 是获取随机数的,也就是说第一个参数是zip文件的绝对路径(zip文件会保持到这,后续获取到字节数组后可选择删除)
    String zipFile = ZipUtils.zip(strWorkPath + AppUtils.randomUUID() + ".zip", files);
    byte[] zipContent = null;
    try {
    //获取压缩文件的字节数组
      zipContent = FileUtils.readFileToByteArray(new File(zipFile));
    } catch (IOException ex) {
      logger.error("word版本文书内容读取失败", ex);
    }

    FileUtils.deleteQuietly(new File(strWorkPath));
    if (delDir != null) { //删除源文件目录
      FileUtils.deleteQuietly(new File(delDir));
    }

    return zipContent;
  }
压缩工具类

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ZipUtils {
    private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);
    private static final int BUFFER_SIZE = 4096;

    private ZipUtils() {
        throw new IllegalStateException("ZipUtils class");
    }

    public static String zip(String zipFile, List<String> files) {
        byte[] buffer = new byte[4096];
        ZipOutputStream out = null;
        FileInputStream fis = null;

        try {
            out = new ZipOutputStream(new FileOutputStream(zipFile));
            Iterator var5 = files.iterator();

            while(var5.hasNext()) {
                String file = (String)var5.next();
                File temp = new File(file);
                fis = new FileInputStream(temp);
                out.putNextEntry(new ZipEntry(temp.getName()));

                int len;
                while((len = fis.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }

                out.closeEntry();
                fis.close();
            }
        } catch (IOException var21) {
            logger.error("文件压缩失败", var21);
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException var20) {
                    logger.error("文件压缩失败", var20);
                }
            }

            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException var19) {
                    logger.error("文件压缩失败", var19);
                }
            }

        }

        return zipFile;
    }
}

3.将自己数组返回给浏览器响应,实现下载
  /**
   * 下载案件文书(zip).
   */
  @RequestMapping(value = "api/downlod/zip", method = RequestMethod.GET)
  public ResponseEntity<byte[]> downloadSimilarCaseByZip(HttpServletRequest request, HttpServletResponse response,
                                  @RequestParam(value = "parameter") String parameter) throws UnsupportedEncodingException {
    byte[] contents =amaze("省略上述获取zip字节数组的步骤")
    // 设置附件名
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDispositionFormData("attachment",AppUtils.encodeFileName( request.getHeader("User-Agent"), "archive"+DateUtils.getNow("YYYYMMddHHmmss") + ".zip"));
   //ResponseEntity是这个包下面的org.springframework.http
    return new ResponseEntity<>(contents, headers, HttpStatus.OK);

在这里插入图片描述

最后:欢迎探讨,不懂得地方可以评论区问我,不足的地方欢迎指出.

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值