zoukankan      html  css  js  c++  java
  • 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请求,所以也是拼接接口路由+参数,用浏览器打开就能弹出下载。

  • 相关阅读:
    jvm基本结构和解析
    多态的意思
    java中对象的简单解读
    double类型和int类型的区别
    python 解析xml文件
    win10不能映射Ubuntu共享文件
    Qt程序打包
    Ubuntu boot分区文件误删,系统无法启动,怎么解
    ubuntu Boot空间不够问题“The volume boot has only 5.1MB disk space remaining”
    Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default
  • 原文地址:https://www.cnblogs.com/nemowang1996/p/11603848.html
Copyright © 2011-2022 走看看