java批量下载文件,打包成jar包下载

代码:

1、获取到批量下载的文件的路径和名称按同样顺序存储到两个集合中,使用时调用这个接口即可批量下载。

    public void fileDownloads() throws IOException {
    	//存储要下载的文件路径
        ArrayList<String> filepathList = new ArrayList<>();
        //存储要下载的文件名称
        ArrayList<String> documentNameList = new ArrayList<>();
        HttpServletRequest servletRequest = this.getServletRequest();
        HttpServletResponse servletResponse = this.getServletResponse();
        //处理数据,将url地址和名字按照同样顺序放入两个集合里面
        String demandRecordId = this.getServletRequest().getParameter("demandRecordId");
        DemandRecordAccessoryExample demandRecordAccessoryExample = new DemandRecordAccessoryExample();
        demandRecordAccessoryExample.createCriteria().andDemandRecordIdEqualTo(demandRecordId);
        List<DemandRecordAccessory> demandRecordAccessoryList = demandRecordAccessoryService.selectByExample(demandRecordAccessoryExample);
        for (int i = 0; i < demandRecordAccessoryList.size(); i++) {
            DemandRecordAccessory demandRecordAccessory = demandRecordAccessoryList.get(i);
            String accessory = demandRecordAccessory.getAccessory();
            if(StringUtils.isNotBlank(accessory)) {
                filepathList.add(accessory);
                List<String> result = Arrays.asList(accessory.split("_"));
                String fileName = result.get(result.size() - 1);
                //修改名字的编码格式
                String encodeFileName = URLEncoder.encode(fileName, "UTF-8");
                documentNameList.add(encodeFileName);
            }
        }
        batchDownLoadFile(servletRequest,servletResponse,"附件",filepathList,documentNameList);
    }

2、将文件打包临时存储到服务器上,导出压缩包后再清除临时文件。

public static void batchDownLoadFile(HttpServletRequest request, HttpServletResponse response, String filename, ArrayList<String> filepath, ArrayList<String> documentname) {
        byte[] buffer = new byte[1024];
        Date date = new Date();
        //生成zip文件存放位置
        String path = "/Users/zhangjianlong/software/tomcat/webapps/picsserver";
        String strZipPath = "/Users/zhangjianlong/software/tomcat/webapps/picsserver" +"/"+ filename +".zip";
        File file = new File(path);
        if (!file.isDirectory() && !file.exists()) {
        //创建单层目录
         file.mkdir();
        // 创建多层目录
        // file.mkdirs();
        }
        try {
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(strZipPath));
            // 需要同时下载的多个文件
            for (int i = 0; i < filepath.size(); i++) {
                File f = new File(filepath.get(i));
                FileInputStream fis = new FileInputStream(f);
                System.out.println(documentname.get(i));
                out.putNextEntry(new ZipEntry(documentname.get(i)));
                //设置压缩文件内的字符编码,不然会变成乱码
                out.setEncoding("GBK");
                int len;
                // 读入需要下载的文件的内容,打包到zip文件
                while ((len = fis.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
                out.closeEntry();
                fis.close();
            }
            out.close();
            downLoadFile(request, response,strZipPath, filename + ".zip");
            File temp = new File(strZipPath);
            if (temp.exists()) {
                temp.delete();
            }
        } catch (Exception e) {
//            logger.error("{}",e);
            e.printStackTrace();
        }
    }

3、将压缩包下载到本地。

 public static void downLoadFile(HttpServletRequest request,HttpServletResponse response,String filePath ,String fileName){
        try {
            OutputStream outputStream = response.getOutputStream();
            FileInputStream fileInputStream=new FileInputStream(new File(filePath));
            response.reset();
            String encodeFileName = URLEncoder.encode(fileName, "UTF-8");
            response.addHeader("Content-Disposition", "attachment; filename=\"" + encodeFileName + "\"");
            response.setContentType("application/octet-stream");
            byte[] b = new byte[1024];
            int len = -1;
            while ((len = fileInputStream.read(b)) != -1) {
                outputStream.write(b, 0, len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
发布了55 篇原创文章 · 获赞 4 · 访问量 3129

猜你喜欢

转载自blog.csdn.net/qq_41347385/article/details/103995660