springboot多文件下载

一次性下载多个文件,遇到问题:只能下载到第一个。

按照网上的解决思路,可以打包成一个文件下载,于是自己写了一个打压缩包下载的示例,供大家简单参考。

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

@RequestMapping(value="/batch/filedownload")
	public Map<String,Object> fileBatchDownload(HttpServletResponse response,@RequestParam("id") String idd) throws IOException{
		Map<String,Object> modelMap = new HashMap<>();
		long id = Long.parseLong(idd);
		Material material = iMaterialService.getOne(new QueryWrapper<Material>().select("APPENDIX_ADDRESS").eq("ID", id));
		String appendixAddress = material.getAppendixAddress();
		List<String> filePaths = getFilePaths(appendixAddress);
		File tempFile = File.createTempFile("tempFile", "zip");
		tempFile = putBatchFilesInZip(filePaths,tempFile);
		//下载头设置。
//		response.setContentType("application/force-download");//
		try(OutputStream os = response.getOutputStream();
				FileInputStream fis = new FileInputStream(tempFile)){
			
			response.setHeader("content-type", "application/octet-stream");
			response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("压缩包.zip", "UTF-8"));
			int len =0;
			byte[] bt = new byte[5*1024];
			while((len = fis.read(bt)) != -1) {
				os.write(bt,0,len);
			}
		}catch(Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}finally {
			tempFile.deleteOnExit();
		}
			
		modelMap.put("success", true);
		return modelMap;
	}
	
	
	/**
	 * 方法说明将files打包放到一个zip中。
	 * @return
	 * @throws IOException 
	 */
	public File putBatchFilesInZip(List<String> filePaths,File tempFile) throws IOException {
		ZipOutputStream zos = new ZipOutputStream(tempFile);
		for(String pathFile : filePaths) {
			File inputFile = new File(pathFile);
			try(FileInputStream fis = new FileInputStream(inputFile);){
				//压缩文件中写入名称
				ZipEntry entry = new ZipEntry(inputFile.getName());
				zos.putNextEntry(entry);
				// 向压缩文件中输出数据
				int len = 0;
				byte[] bt = new byte[5*1024];
				while ((len = fis.read(bt)) != -1) {
					//压缩文件中写入真正的文件流
					zos.write(bt, 0, len);
				}
				
			}catch(Exception e) {
				e.printStackTrace();
				throw new RuntimeException();
			}

		}
		zos.flush();
		zos.close();
		return tempFile;
	}
}

注意点:

1.引入的包是org.apache.tools.zip提供的,没有采用java.util自带的。好处是new FileInputStream(inputFile)参数可以是File类型。

2.io流初始化在try后面,try执行完毕会自动关闭流,代码逻辑更清楚,简单。

本人对io流知识并不是特别清楚,只会基本的调用,如果代码中使用不恰当的地方,请大家指出,我会虚心学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值