java 文件打压缩包下载
项目中需要将多个文件打包成压缩包下载。
总共文件是,一个从磁盘读取的文件,其他文件通过url从oss下载的文件,
@GetMapping("/export/{id}") public void exportById(@PathVariable Integer id,HttpServletResponse response) { StRecord record = stRecordBiz.selectByPrimaryKey(id); String filename="单证"+record.getDiagnosisNo(); //xls url StringBuffer xls = new StringBuffer(); //准备zip OutputStream outputStream = null; ZipOutputStream zos = null; //导出的zip输出流 BufferedInputStream bis = null;//从磁盘读文件缓冲 FileInputStream wordIs = null;//从磁盘读文件 //导出word String wordName = filePath+filename+".doc";//从磁盘读取文件的文件名 ZipEntry entry = new ZipEntry(filename+".doc"); //压缩包中的每一个文件是一个zip int len; File file = new File(wordName); try{
//一下代码是从磁盘读取文件,输出到zip的输出流里 outputStream = response.getOutputStream(); zos = new ZipOutputStream(outputStream); wordIs = new FileInputStream(file); byte[] buffer = new byte[1024*4]; bis = new BufferedInputStream(wordIs); zos.putNextEntry(entry); while ((len = bis.read(buffer)) != -1){ zos.write(buffer,0,len); } } catch (IOException e) { log.error("zip 错误", e); }finally { if (entry !=null){ try { zos.closeEntry(); } catch (IOException e) { log.error(" entry 关闭异常", e); } } try { bis.close(); } catch (IOException e) { log.error("BufferedInputStream 关闭异常", e); } try { wordIs.close(); } catch (IOException e) { log.error("FileInputStream 关闭异常", e); } file.delete();//删除临时文件 } try { //导出excel exportExcel(zos,xls); //根据url,输出多个文件 //返回格式 response.setContentType("multipart/form-data"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(filename.getBytes("utf-8"), "iso8859-1") + ".zip\""); } catch (Exception e) { e.printStackTrace(); } finally { if(zos != null){ try { zos.close(); } catch (IOException e) { log.error("zos 关闭异常", e); } } try { outputStream.close(); } catch (IOException e) { log.error("outputStream 关闭异常", e); } } }
private void exportExcel(ZipOutputStream zos,StringBuffer xls){ if(StringUtils.isNotEmpty(xls)){ String[] split = xls.toString().split(","); for (String item:split) { ZipEntry entry = new ZipEntry(item);//文件名 try { zos.putNextEntry(entry); byte[] contentBytes = getFileByte(item);//通过url请求文件,返回文件字节码 zos.write(contentBytes); } catch (IOException e) { log.error("将excel添加进zip异常", e); }finally { if (entry == null) { try { zos.closeEntry(); } catch (IOException e) { log.error("entry 关闭异常", e); } } } } } }
private byte[] getFileByte(String url){ HttpClient client = HttpClients.custom().build(); HttpGet get = new HttpGet(url); HttpResponse response; try { response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { // 得到实体 HttpEntity entity = response.getEntity(); byte[] data = EntityUtils.toByteArray(entity); return data; } else { logger.error("下载文件url 错误返回:{}",response); return null; } } catch (IOException e) { e.printStackTrace(); logger.error("下载文件url 错误:",e); } return null; }
总结:注意关闭流时,按照打开的顺序,倒序关闭。