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;
    }

 

 总结:注意关闭流时,按照打开的顺序,倒序关闭。

 

posted @ 2021-12-20 11:58  小小小小青石  阅读(436)  评论(0)    收藏  举报