zip文件下载
Posted 小蜗牛爱远行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zip文件下载相关的知识,希望对你有一定的参考价值。
- **
java文件压缩成zip文件下载
**
-
服务器上多文件下载,zip文件下载
-
优化重复文件名报错问题
/** * req 请求头 * response 返回体 * fileInfoList 文件实体类,没实体类的话直接构造List<Map>即可 * fileName 压缩文件名称 */ public void downForZip(HttpServletRequest req, HttpServletResponse response, List<BdcdjFiles> fileInfoList, String fileName) // 创建临时文件 File zipFile = null; FileInputStream fis = null; BufferedInputStream buff = null; try //临时文件名称 zipFile = File.createTempFile("test", ".zip"); FileOutputStream fot = new FileOutputStream(zipFile); // 为任何OutputStream产生校验,第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种) CheckedOutputStream cos = new CheckedOutputStream(fot, new Adler32()); // 用于将数据压缩成Zip文件格式 ZipOutputStream zos = new ZipOutputStream(cos); Set<String> fileNameSet = new HashSet<>(); int flag = 1; for (BdcdjFiles file: fileInfoList) String[] strs = file.getFilepath().split("/"); String itemFileName = strs[strs.length-1]; //根据文件信息获取输入流。这个看实际的业务目的就是获取当前文件的输入流 File itemFile = new File(uploadPath + file.getFilepath().replace(fileUrl, "")); if (!itemFile.exists()) continue; InputStream inputStream = new FileInputStream(uploadPath + "/" + itemFileName); // 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名 //多个文件名称重复时zos.putNextEntry()会报错!! 可以再文件名称后面加编号等操作 if (fileNameSet.contains(file.getFilename())) String[] name = file.getFilename().split("\\\\."); String newName = name[0] + flag + "." + name[1]; zos.putNextEntry(new ZipEntry(newName)); fileNameSet.add(newName); flag++; else zos.putNextEntry(new ZipEntry(file.getFilename())); fileNameSet.add(file.getFilename()); zos.putNextEntry(new ZipEntry(file.getFilename())); int bytesRead = 0; // 向压缩文件中输出数据 while ((bytesRead = inputStream.read()) != -1) zos.write(bytesRead); inputStream.close(); // 当前文件写完,写入下一个文件 zos.closeEntry(); zos.close(); ServletOutputStream os = response.getOutputStream(); //下载文件,使用spring框架中的FileCopyUtils工具 response.setCharacterEncoding("GB2312"); response.setContentType(req.getSession().getServletContext().getMimeType(fileName)); //设置响应头,attachment表示以附件的形式下载,inline表示在线打开 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); fis = new FileInputStream(zipFile); buff = new BufferedInputStream(fis); FileCopyUtils.copy(buff, os); catch (Exception e1) throw new BzywException("批量下载失败"); // 关闭流 finally try if (null != fis) fis.close(); if (null != buff) buff.close(); catch (IOException e) log.error( "流关闭异常"); // 删除临时文件 if (null != zipFile) zipFile.delete();
以上是关于zip文件下载的主要内容,如果未能解决你的问题,请参考以下文章
linux下分卷压缩,从Linux下载大于4G文件到本地,并且在本地合并