首页 > 编程语言 >java 获取远程PDF文件并批量下载

java 获取远程PDF文件并批量下载

时间:2022-10-30 21:34:33浏览次数:46  
标签:map java String 批量 import fileName new PDF


package pdf;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @date 2022/10/30
 **/
@Slf4j
public class ZipDownFile {

    /***
     * 获取远程文件信息
     * @param httpUrls
     * @return {@link List< Map< String, Object>>}
     * @date 2022/10/30
    **/

    public static List<Map<String, Object>> getRomteFileData(List<String> httpUrls) throws IOException {
        String strTime = DateUtil.format(new Date(), "yyyyMMddHHmmss");
        // 待下载文件列表
        List<Map<String, Object>> files = new ArrayList<>();
        // 排除重名文件
        Set<String> existFileName = new HashSet<>();
        for (String httpUrl : httpUrls) {
            String fileName = null;
            Map<String, Object> map = new HashMap<>();
            InputStream inputStream = null;
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            try {
                URL url = new URL(httpUrl);
                // 获取中文文件名
                String fileNameEncode = org.apache.commons.lang3.StringUtils.substringAfter(url.getFile(), "&fileName=");
                fileName = URLDecoder.decode(fileNameEncode, CharsetUtil.UTF_8);
                if (!existFileName.add(fileName)) {
                    continue;
                }
                map.put("fileName", strTime + fileName + ".pdf");

                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("GET");
                con.setConnectTimeout(10 * 1000);
                inputStream = con.getInputStream();
                if (Objects.nonNull(inputStream)) {
                    byte[] buf = new byte[1024];
                    int len;
                    while ((len = inputStream.read(buf)) > 0) {
                        bos.write(buf, 0, len);
                    }
                }
            } catch (Exception e) {
                bos.write((fileName + e.getMessage()).getBytes(StandardCharsets.UTF_8));
                map.put("fileName", strTime + fileName + ".txt");
                log.error("获取远程文件信息错误信息:" + e.getMessage());
            } finally {
                IoUtil.close(inputStream);
                IoUtil.close(bos);
            }
            map.put("outByte", bos.toByteArray());
            files.add(map);
        }
        return files;
    }

    /***
     * 批量下载文件
     * @param response 
     * @param maps 
     * @date 2022/10/30 
    **/
    
    public static void downloadZip(HttpServletResponse response, List<Map<String, Object>> maps) throws IOException {
        String strTime = DateUtil.format(new Date(), "yyyyMMddHHmmss");
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(strTime + "对账单", "UTF-8") + ".zip");
        ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
        try {
            for (Map<String, Object> map : maps) {
                ZipEntry zipEntry = new ZipEntry((String) map.get("fileName"));
                zipOutputStream.putNextEntry(zipEntry);
                zipOutputStream.write((byte[]) map.get("outByte"));
            }
        } catch (Exception e) {
            log.error("下载远程文件信息错误信息:" + e.getMessage());
        } finally {
            IoUtil.close(zipOutputStream);
        }
    }

    /***
     * 批量保存文件
     * @param outputStream 
     * @param maps 
     * @date 2022/10/30 
    **/
    
    public static void downloadZip(OutputStream outputStream, List<Map<String, Object>> maps) throws IOException {
        String strTime = DateUtil.format(new Date(), "yyyyMMddHHmmss");
        ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
        try {
            for (Map<String, Object> map : maps) {
                ZipEntry zipEntry = new ZipEntry((String) map.get("fileName"));
                zipOutputStream.putNextEntry(zipEntry);
                zipOutputStream.write((byte[]) map.get("outByte"));
            }
        } catch (Exception e) {
            log.error("下载远程文件信息错误信息:" + e.getMessage());
        } finally {
            IoUtil.close(zipOutputStream);
        }
    }

}

    @Test
    public void test02() throws Exception {
        List<String> httpUrls = new ArrayList<>();
        httpUrls.add("https://tsign.49icloud.com/rest/file-system/operation/download?fileName=对账单1");
        httpUrls.add("https://tsign.49icloud.com/rest/file-system/operation/download?fileName=对账单2");
        List<Map<String, Object>> romteFileData = ZipDownFile.getRomteFileData(httpUrls);

        String targetFile = "D:\\reloadD\\www\\java\\study\\_2020\\src\\main\\java\\pdf\\downFile.zip";


        ZipDownFile.downloadZip(new FileOutputStream(targetFile), romteFileData);
    }

标签:map,java,String,批量,import,fileName,new,PDF
From: https://www.cnblogs.com/fuqian/p/16842289.html

相关文章

  • 必与收银,必与云POS收银,必与saas,批量设置管库存,可打折,可销售
    ......
  • JavaWeb之连接数据库操作
    亲爱的学弟学妹,我知道你们是因为什么搜到这篇博客的,我也很懂你们现在的心情,此时此刻举目无亲面对着建民老师的高要求,你们或许十分无助,所以我写下这篇博客,因为我淋过雨所以......
  • 学习记录23java拼图小游戏
    拼图目标GUI(GraphicalUserInterface,图形用户接口)这是指采用图形化的方式显示操作界面,几乎所有的语言都有GUI的知识java中有两套完整的体系:AWT包(出现的比较早,可能......
  • Java线程实现/创建方式
    Java线程实现/创建方式继承Thread类:Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。st......
  • 【笔记09】Javascript - 函数 - 闭包
    【笔记09】Javascript-基本概念-(闭包)内部函数被return 到外部。functiona(){functionb(){varbbb=234;console.log(aaa);}varaaa=......
  • Java JMS
    JMS​​JSR343:JavaTMMessageService2.0​​​MOM系列文章之-JMS2spec.解读​​JMS2.0的新变化​​MOM系列文章之-FinalConsistency讨论​​SunJavaSystem......
  • Javaweb基础知识复习------AJAX
    AJAX相关知识复习简而言之,就是可以用AJAX+HTML代替JSP页面,也可以进行异步交互,更关心部分界面Ajax案例后端代码就是一个servlet文件,前端页面的代码也不是很常用,可以在下......
  • JavaScript是什么?
    从头认识JavaScriptJavaScript简称‘JS’,是一款用来在网页中添加一些动态效果与交互功能的客户端语言,虽然如今看来这是前端工程师的必修课,但其实这在前后端还没有分离的......
  • Java中String的分词方法split的使用
    在java.lang包中有String.split()方法,返回是一个数组1、如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");2、......
  • Java: Record
    /***版权所有2022涂聚文有限公司*许可信息查看:*描述:**历史版本:JDK17.01*2022-09-12创建者geovindu*2022-09-12添加Lambda*2022-09-12修......