• Java Springboot 根据图片链接生成图片下载链接 及 多个图片打包zip下载链接


    现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式。

    现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载。由于前端存在跨域问题,所以图片下载由后台接口完成。

    首先编写文件下载工具类:

     1 import java.net.URL;
     2 import java.net.MalformedURLException;
     3 import org.apache.commons.io.FileUtils;
     4 
     5 public class FileDownloadUtil {
     6 /**
     7      * 下载文件---返回下载后的文件存储路径
     8      *
     9      * @param url 文件路径
    10     * @param dir 目标存储目录
    11     * @param fileName 存储文件名
    12     * @return
    13     */
    14    public static void downloadHttpUrl(String url, String dir, String fileName) throws BusinessException {
    15        try {
    16        URL httpurl = new URL(url);
    17        File dirfile = new File(dir);
    18            if (!dirfile.exists()) {
    19                dirfile.mkdirs();
    20            }
    21            FileUtils.copyURLToFile(httpurl, new File(dir+fileName));
    22        } catch (MalformedURLException e) {
    23            e.printStackTrace();
    24        } catch (IOException e) {
    25            e.printStackTrace();26         }
    26    }
    27 
    28     public static boolean deleteFile(File file) {
    29         if (file.exists()) {
    30             return file.delete();
    31         }
    32         return false;
    33     }
    34

    单张图片下载

    Controller层接口:

     1 import org.apache.commons.lang.StringUtils;
     2 import java.io.*;
     3 
     4 
     5 protected HttpServletResponse response;
     6 
     7 /**
     8      * 单张图片下载
     9      *
    10      * @param url 要下载的图片url
    11      * @author: nemowang
    12      */
    13     @ApiImplicitParams({
    14             @ApiImplicitParam(name = "url", value = "图片url", required = true, dataType = "String", paramType = "query"),
    15     })
    16     @ApiOperation(value = "单张图片下载", notes = "单张图片下载")
    17     @RequestMapping(value = "/downloadPicture", method = RequestMethod.GET)
    18     public void downloadPicture(String url) {
    19         
    20         // 拼接完整图片路径。这里填写图片链接
    21         String urlPath = "";
    22 
    23         // 获取图片文件后缀名
    24         String postfix = "." + StringUtils.substringAfterLast(url, ".");
    25 
    26         // 获取当前类的所在项目路径
    27         File directory = new File("");
    28         String courseFile;
    29 
    30         String srcPath;
    31         File srcFile = null;
    32         FileInputStream fileInputStream = null;
    33         InputStream fis = null;
    34         OutputStream out = null;
    35         try {
    36             courseFile = directory.getCanonicalPath();
    37             String fileName = "\" + StringUtil.getUUID() + postfix;
    38             // 下载文件
    39             FileDownloadUtil.downloadHttpUrl(urlPath, courseFile, fileName);
    40 
    41             srcPath = courseFile + fileName;
    42             srcFile = new File(srcPath);
    43 
    44             fileInputStream = new FileInputStream(srcPath);
    45             fis = new BufferedInputStream(fileInputStream);
    46             byte[] buffer = new byte[fis.available()];
    47             fis.read(buffer);
    48 
    49             response.setContentType("application/octet-stream");
    50             response.setHeader("Content-disposition", "attachment;filename=" + fileName);
    51             out = response.getOutputStream();
    52             out.write(buffer);
    53             out.flush();
    54             out.close();
    55         } catch (Exception e) {
    56             e.printStackTrace();
    57         } finally {
    58             try {
    59                 if (fileInputStream != null) {
    60                     fileInputStream.close();
    61                 }
    62                 if (fis != null) {
    63                     fis.close();
    64                 }
    65                 if (out != null) {
    66                     out.close();
    67                 }
    68             } catch (IOException e) {
    69                 e.printStackTrace();
    70             }
    71         }
    72 
    73         // 删除中间文件
    74         if (srcFile != null) {
    75             System.out.println(FileDownloadUtil.deleteFile(srcFile));
    76         }
    77     }

    因为是GET请求,所以直接拼接接口路由+参数,用浏览器打开就能弹出下载。

    至此单张图片下载接口结束。

    多张图片打包下载

    Controller层接口:

     1 /**
     2      * 图片打包下载
     3      */
     4     @ApiImplicitParams({
     5             @ApiImplicitParam(name = "urls", value = "图片url列表", required = true, dataType = "List", paramType = "query"),
     6     })
     7     @ApiOperation(value = "图片打包下载", notes = "图片打包下载")
     8     @RequestMapping(value = "/downloadPictureList", method = RequestMethod.GET)
     9     public void downloadPictureList(List urls) {
    10         List<String> fileNameList = new ArrayList<>();
    11 
    12         for (int i = 0; i < urls.size(); i++) {
    13             // 获取文件名
    14             fileNameList.add(StringUtils.substringAfterLast(urls.get(i), "/"));
    15 
    16             // 拼接完整图片路径
    17             urls.set(i, DOMAIN + urls.get(i));
    18         }
    19 
    20         // 获取当前类的所在项目路径
    21         File directory = new File("");
    22         String courseFile;
    23 
    24         String srcPath;
    25         File srcFile = null;
    26 
    27         // 要打包的文件列表
    28         List<File> fileList = new ArrayList<>();
    29 
    30         ZipOutputStream zos = null;
    31         OutputStream out = null;
    32         try {
    33             courseFile = directory.getCanonicalPath();
    34 
    35             // 下载文件
    36             for (int i = 0; i < urls.size(); i++) {
    37                 String fileName = "\" + fileNameList.get(i);
    38                 FileDownloadUtil.downloadHttpUrl(urls.get(i), courseFile, fileName);
    39                 srcPath = courseFile + fileName;
    40                 srcFile = new File(srcPath);
    41                 fileList.add(srcFile);
    42             }
    43 
    44 
    45 
    46             long start = System.currentTimeMillis();
    47 
    48             response.setContentType("application/x-zip-compressed");
    49             response.setHeader("Content-disposition", "attachment;filename=" + StringUtil.getUUID() + ".zip");
    50             out = response.getOutputStream();
    51             zos = new ZipOutputStream(out);
    52             for (File file : fileList) {
    53                 byte[] buf = new byte[BUFFER_SIZE];
    54                 zos.putNextEntry(new ZipEntry(file.getName()));
    55                 int len;
    56                 FileInputStream in = new FileInputStream(file);
    57                 while ((len = in.read(buf)) != -1) {
    58                     zos.write(buf, 0, len);
    59                 }
    60                 zos.closeEntry();
    61                 in.close();
    62             }
    63             long end = System.currentTimeMillis();
    64             System.out.println("压缩完成,耗时:" + (end - start) + " ms");
    65 
    66 
    67             out.flush();
    68         } catch (IOException e) {
    69             e.printStackTrace();
    70         } catch (Exception e) {
    71                 throw new RuntimeException("zip error from ZipUtils", e);
    72         } finally {
    73             if (zos != null) {
    74                 try {
    75                     zos.close();
    76                 } catch (IOException e) {
    77                     e.printStackTrace();
    78                 }
    79             }
    80             if (out != null) {
    81                 try {
    82                     zos.close();
    83                 } catch (IOException e) {
    84                     e.printStackTrace();
    85                 }
    86             }
    87         }
    88 
    89         // 删除中间文件
    90         if (fileList != null) {
    91             for (File file : fileList) {
    92                 System.out.println(FileDownloadUtil.deleteFile(file));
    93             }
    94         }
    95     }

    同样是GET请求,所以也是拼接接口路由+参数,用浏览器打开就能弹出下载。

  • 相关阅读:
    抽象工厂模式
    工厂方法模式
    单例模式
    适配器模式
    外观模式
    简单工厂模式
    设计模式开篇闲谈
    android ui更新
    android获取Context
    android 事件绑定
  • 原文地址:https://www.cnblogs.com/nemowang1996/p/11603848.html
Copyright © 2020-2023  润新知