文件打成压缩包下载

多文件打成zip直接在浏览器下载方法

@Override
    public void downloadZip(Long reportId, HttpServletRequest request, HttpServletResponse response) {
        //响应头的设置
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/force-download");

        ReportGeneration report = reportMapper.selectReportGenerationById(reportId);
        //查询数据库获取文件信息
        List<ReportGeneration> reports = getNowDayOrder(reportId);
        //设置压缩包的名字
        String downloadName = report.getSiteName() + ".zip";
        try {
        	//downloadName需要根据浏览器转换
            downloadName = FileUtils.setFileDownloadHeader(request,downloadName);
            response.setHeader("Content-Disposition", "attachment;filename=" + downloadName + "");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //设置压缩流:直接写入response,实现边压缩边下载
        ZipOutputStream zipos = null;
        try {
            zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
            zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法
        } catch (Exception e) {
            e.printStackTrace();
        }
        //循环将文件写入压缩流
        DataOutputStream os = null;
        String profile =  RuoYiConfig.getProfile();
        for(ReportGeneration dao : reports){
            List<UniversalUploadFile> uufs = queryFiles(dao.getReportId());
            if(uufs == null || uufs.size() < 1){
                continue;
            }
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");
            String star =  formatter.format(dao.getStartTime());
            for (UniversalUploadFile item : uufs){
                String fileName = item.getFileName();
                String filePath = profile + item.getFilePath();
                String funCode = item.getFunCode();
                File file = new File(filePath);
                if (!file.exists()) {
                    continue;
                }else{
                    try {
                        funCode = PhotoConstant.FILE_NAME.get(funCode);
                        //添加ZipEntry,并ZipEntry中写入文件流
                        zipos.putNextEntry(new ZipEntry(star + "/" + funCode + fileName));
                        os = new DataOutputStream(zipos);
                        InputStream is = new FileInputStream(file);
                        byte[] b = new byte[4096];
                        int length = 0;
                        while ((length = is.read(b)) != -1) {
                            os.write(b, 0, length);
                        }
                        is.close();
                        zipos.closeEntry();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        //关闭流
        try {
            os.flush();
            os.close();
            zipos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

下载文件名重新编码

	/**
     * 下载文件名重新编码
     * 
     * @param request 请求对象
     * @param fileName 文件名
     * @return 编码后的文件名
     */
    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
    {
        final String agent = request.getHeader("USER-AGENT");
        String filename = fileName;
        if (agent.contains("MSIE"))
        {
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        }
        else if (agent.contains("Firefox"))
        {
            // 火狐浏览器
            filename = new String(fileName.getBytes(), "ISO8859-1");
        }
        else if (agent.contains("Chrome"))
        {
            // google浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        else
        {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }

前端处理

downloadZip(row) {
      //直接访问接口并下载文件
      window.location.href = process.env.VUE_APP_BASE_API + "/webReport/downloadZip/" + row.reportId;
},
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值