JAVA文件批量下载打成压缩包

该代码实现了一个文件批量下载的功能,首先从资源服务器下载指定路径的文件,然后将这些文件压缩成ZIP格式,最后将压缩包内容返回给前端进行下载。过程中涉及文件路径的处理、文件流操作以及文件的压缩和解压。同时,处理了文件名的乱码问题,确保在不同浏览器下都能正确下载。
摘要由CSDN通过智能技术生成
/**
     * 
     * @param request
     * @param response
     * @param filePathList   文件路径集合
     */
    @ApiOperation(value = "文件批量下载")
    @PostMapping("/downLoad/zip")
    public void download(@RequestBody List<String> filePathList, HttpServletRequest request, final HttpServletResponse response) {

        List<File> resultFileList = new ArrayList<>();
        File file = null;
        try {
            for (String filePath:filePathList) {
                String fileName =  filePath.substring(filePath.lastIndexOf("/")+1);
                log.info("文件路径转一下格式");
                filePath = URLDecoder.decode(filePath, "utf-8");
				log.info("保存的路径名称");
                String destFile = "/home/data/" + fileName;
                log.info("1. 先从资源服务器下载 文件");
                HttpUtil.downloadFile(filePath , destFile);
                log.info("2. 返回file");
                file = new File(destFile);
                resultFileList.add(file);

            }
            log.info("3. 把文件压缩进去");
            File zipFile = new File("/home/data/批量下载.zip");
            zipFiles(resultFileList,zipFile);
            log.info("4. 把压缩包的文件流返回前端");
            FileDownload.downFile(request, response, "批量下载.zip", zipFile);

        } catch (Exception e) {
            e.printStackTrace();
        } 
    }


/**
     * 
     * @param srcFiles 要压缩的文件
     * @param zipFile 压缩后的压缩包
     */
public static void zipFiles(List<File> srcFiles, File zipFile) {
        // 判断压缩后的文件存在不,不存在则创建
        if (!zipFile.exists()) {
            try {
                zipFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 创建 FileOutputStream 对象
        FileOutputStream fileOutputStream = null;
        // 创建 ZipOutputStream
        ZipOutputStream zipOutputStream = null;
        // 创建 FileInputStream 对象
        FileInputStream fileInputStream = null;

        try {
            // 实例化 FileOutputStream 对象
            fileOutputStream = new FileOutputStream(zipFile);
            // 实例化 ZipOutputStream 对象
            zipOutputStream = new ZipOutputStream(fileOutputStream);
            // 创建 ZipEntry 对象
            ZipEntry zipEntry = null;
            // 遍历源文件数组
            int i = 1;
            for (File srcFile:srcFiles) {
                // 将源文件数组中的当前文件读入 FileInputStream 流中
                fileInputStream = new FileInputStream(srcFile);
                // 实例化 ZipEntry 对象,源文件数组中的当前文件,加个i防止有重名文件压缩失败
                zipEntry = new ZipEntry("[" + i + "]" +srcFile.getName());

                zipOutputStream.putNextEntry(zipEntry);
                // 该变量记录每次真正读的字节个数
                int len;
                // 定义每次读取的字节数组
                byte[] buffer = new byte[1024];
                while ((len = fileInputStream.read(buffer)) > 0) {
                    zipOutputStream.write(buffer, 0, len);
                }
                i++;
            }
            zipOutputStream.closeEntry();
            zipOutputStream.close();
            fileInputStream.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }




public static void downFile(HttpServletRequest request, HttpServletResponse response, String filename, File file) throws IOException {
		//  文件存在才下载
		if (file.exists()) {
			OutputStream out = null;
			FileInputStream in = null;
			try {
				// 1.读取要下载的内容
				in = new FileInputStream(file);

				// 2. 告诉浏览器下载的方式以及一些设置
				// 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码
				String agent = request.getHeader("user-agent");
				if (agent.toLowerCase().contains("Firefox".toLowerCase())) {
					filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
				} else {
					filename = URLEncoder.encode(filename, "UTF-8");
				}
				// 设置下载文件的mineType,告诉浏览器下载文件类型
				String mineType = request.getServletContext().getMimeType(filename);
				response.setContentType(mineType);
				// 设置一个响应头,无论是否被浏览器解析,都下载
				response.setHeader("Content-disposition", "attachment; filename=" + filename);
				// 将要下载的文件内容通过输出流写到浏览器
				out = response.getOutputStream();
				int len = 0;
				byte[] buffer = new byte[1024];
				while ((len = in.read(buffer)) > 0) {
					out.write(buffer, 0, len);
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			}
		}
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值