springMVC实现图片打包下载

该博客介绍了一个SpringMVC控制器方法,用于处理GET请求并打包多个图片为ZIP文件供用户下载。首先,它创建一个包含图片URL的列表,然后遍历这些URL,从服务器下载图片流并存入Map中。接着,通过设置HTTP响应的Content-Type和Content-Disposition头,使浏览器以附件形式下载ZIP文件,并创建ZipOutputStream以将图片流压缩到ZIP文件中。最后,使用addToZip方法将每个图片流添加到ZIP输出流中,完成打包过程。
@RequestMapping(value = "/downLoadFile", method = RequestMethod.GET)
public void downLoadFile(HttpServletResponse response) throws Exception {
    // 创建图片URL的地址
    List<String> urls = new ArrayList<>();
    urls.add("/g1/M00/2B/87/rBBrBlpdfamACuzRAA6DWWpqXtk256.jpg");
    ...
    //创建map用于存放从服务器下载的图片流文件
    Map<String, InputStream> isMap = Maps.newHashMap();
    urls.forEach(urlStr -> {
        //分解图片文件名
        String[] fileNameParts = urlStr.split("/");
        String fileName = fileNameParts[fileNameParts.length - 1];
        try {
            //创建URL对象用于连接存放图片的服务器
            URL url = new URL(urlStr);
            //建立连接
            URLConnection con = url.openConnection();
            // 设置超时间为3            con.setConnectTimeout(3 * 1000);
            // 防止屏蔽程序抓取而返回403错误
            con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            //从服务器下载图片流文件
            InputStream is = con.getInputStream();
            //将图片流文件放入isMap            isMap.put(fileName, is);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

    //设置浏览器返回体的内容以及编码、文件名字
    response.setContentType("application/octet-stream");
    String filename = URLEncoder.encode("文件名字", "UTF-8");
    response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".zip");
    //创建ZipOutputStream对象,先是获取到response对象的输出流对象,把它转成ZipOutputStream对象,然后给ZipOutputStream流里写入文件的信息,就会同步设置在response的输出流里了
    ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
    isMap.forEach((fileName, is) -> {
        try {
            addToZip(is, zipOut, fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
    zipOut.flush();
    zipOut.close();
}

private void addToZip(InputStream is, ZipOutputStream zipOut, String fileName) throws IOException {
    fileName = URLEncoder.encode(fileName, "UTF-8");
    ZipEntry entry = new ZipEntry(fileName);
    zipOut.putNextEntry(entry);
    int len;
    byte[] buffer = new byte[1024];
    while ((len = is.read(buffer)) > 0) {
        zipOut.write(buffer, 0, len);
    }
    zipOut.closeEntry();
    is.close();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值