Java Springboot如何基于图片生成下载链接

 更新时间:2020年03月30日 10:20:41   作者:NemoWang  
这篇文章主要介绍了Java Springboot如何基于图片生成下载链接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

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

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

import java.net.URL;
import java.net.MalformedURLException;
import org.apache.commons.io.FileUtils;

public class FileDownloadUtil {
/**
   * 下载文件---返回下载后的文件存储路径
   *
   * @param url 文件路径
  * @param dir 目标存储目录
  * @param fileName 存储文件名
  * @return
  */
  public static void downloadHttpUrl(String url, String dir, String fileName) throws BusinessException {
    try {
    URL httpurl = new URL(url);
    File dirfile = new File(dir);
      if (!dirfile.exists()) {
        dirfile.mkdirs();
      }
      FileUtils.copyURLToFile(httpurl, new File(dir+fileName));
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();26     }
  }

  public static boolean deleteFile(File file) {
    if (file.exists()) {
      return file.delete();
    }
    return false;
  }
}

单张图片下载

Controller层接口:

import org.apache.commons.lang.StringUtils;
import java.io.*;


protected HttpServletResponse response;

/**
   * 单张图片下载
   *
   * @param url 要下载的图片url
   * @author: nemowang
   */
  @ApiImplicitParams({
      @ApiImplicitParam(name = "url", value = "图片url", required = true, dataType = "String", paramType = "query"),
  })
  @ApiOperation(value = "单张图片下载", notes = "单张图片下载")
  @RequestMapping(value = "/downloadPicture", method = RequestMethod.GET)
  public void downloadPicture(String url) {
    
    // 拼接完整图片路径。这里填写图片链接
    String urlPath = "";

    // 获取图片文件后缀名
    String postfix = "." + StringUtils.substringAfterLast(url, ".");

    // 获取当前类的所在项目路径
    File directory = new File("");
    String courseFile;

    String srcPath;
    File srcFile = null;
    FileInputStream fileInputStream = null;
    InputStream fis = null;
    OutputStream out = null;
    try {
      courseFile = directory.getCanonicalPath();
      String fileName = "\\" + StringUtil.getUUID() + postfix;
      // 下载文件
      FileDownloadUtil.downloadHttpUrl(urlPath, courseFile, fileName);

      srcPath = courseFile + fileName;
      srcFile = new File(srcPath);

      fileInputStream = new FileInputStream(srcPath);
      fis = new BufferedInputStream(fileInputStream);
      byte[] buffer = new byte[fis.available()];
      fis.read(buffer);

      response.setContentType("application/octet-stream");
      response.setHeader("Content-disposition", "attachment;filename=" + fileName);
      out = response.getOutputStream();
      out.write(buffer);
      out.flush();
      out.close();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (fileInputStream != null) {
          fileInputStream.close();
        }
        if (fis != null) {
          fis.close();
        }
        if (out != null) {
          out.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }

    // 删除中间文件
    if (srcFile != null) {
      System.out.println(FileDownloadUtil.deleteFile(srcFile));
    }
  }

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

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

多张图片打包下载

Controller层接口:

/**
   * 图片打包下载
   */
  @ApiImplicitParams({
      @ApiImplicitParam(name = "urls", value = "图片url列表", required = true, dataType = "List", paramType = "query"),
  })
  @ApiOperation(value = "图片打包下载", notes = "图片打包下载")
  @RequestMapping(value = "/downloadPictureList", method = RequestMethod.GET)
  public void downloadPictureList(List urls) {
    List<String> fileNameList = new ArrayList<>();

    for (int i = 0; i < urls.size(); i++) {
      // 获取文件名
      fileNameList.add(StringUtils.substringAfterLast(urls.get(i), "/"));

      // 拼接完整图片路径
      urls.set(i, DOMAIN + urls.get(i));
    }

    // 获取当前类的所在项目路径
    File directory = new File("");
    String courseFile;

    String srcPath;
    File srcFile = null;

    // 要打包的文件列表
    List<File> fileList = new ArrayList<>();

    ZipOutputStream zos = null;
    OutputStream out = null;
    try {
      courseFile = directory.getCanonicalPath();

      // 下载文件
      for (int i = 0; i < urls.size(); i++) {
        String fileName = "\\" + fileNameList.get(i);
        FileDownloadUtil.downloadHttpUrl(urls.get(i), courseFile, fileName);
        srcPath = courseFile + fileName;
        srcFile = new File(srcPath);
        fileList.add(srcFile);
      }



      long start = System.currentTimeMillis();

      response.setContentType("application/x-zip-compressed");
      response.setHeader("Content-disposition", "attachment;filename=" + StringUtil.getUUID() + ".zip");
      out = response.getOutputStream();
      zos = new ZipOutputStream(out);
      for (File file : fileList) {
        byte[] buf = new byte[BUFFER_SIZE];
        zos.putNextEntry(new ZipEntry(file.getName()));
        int len;
        FileInputStream in = new FileInputStream(file);
        while ((len = in.read(buf)) != -1) {
          zos.write(buf, 0, len);
        }
        zos.closeEntry();
        in.close();
      }
      long end = System.currentTimeMillis();
      System.out.println("压缩完成,耗时:" + (end - start) + " ms");


      out.flush();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (Exception e) {
        throw new RuntimeException("zip error from ZipUtils", e);
    } finally {
      if (zos != null) {
        try {
          zos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if (out != null) {
        try {
          zos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }

    // 删除中间文件
    if (fileList != null) {
      for (File file : fileList) {
        System.out.println(FileDownloadUtil.deleteFile(file));
      }
    }
  }

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解springboot整合ehcache实现缓存机制

    详解springboot整合ehcache实现缓存机制

    这篇文章主要介绍了详解springboot整合ehcache实现缓存机制,ehcache提供了多种缓存策略,主要分为内存和磁盘两级,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 浅析Java中的SPI原理

    浅析Java中的SPI原理

    SPI:由调用方制定接口标准,实现方来针对接口提供不同的实现,SPI其实就是"为接口查找实现"的一种服务发现机制。本文将浅谈一下SPI机制的原理,需要的可以参考一下
    2022-09-09
  • Spring Validation实现数据校验的示例

    Spring Validation实现数据校验的示例

    Spring Validation其实就是对Hibernate Validator进一步的封装,方便在Spring中使用,这篇文章主要介绍了Spring Validation实现数据校验的示例,需要的朋友可以参考下
    2023-03-03
  • Java源码解析之GenericDeclaration详解

    Java源码解析之GenericDeclaration详解

    这篇文章主要介绍了Java源码解析之GenericDeclaration详解。有句古话说得好,源码能使人快乐!这里分享给大家,供需要的朋友参考。
    2017-10-10
  • 解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    本篇文章主要介绍了解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java基础之简单介绍一下Maven

    Java基础之简单介绍一下Maven

    今天给大家复习一下Java基础知识,简单介绍Maven,文中有非常详细的解释,对Java初学者很有帮助哟,需要的朋友可以参考下
    2021-05-05
  • Java 日期格式加上指定月数(一个期限)得到一个新日期的实现代码

    Java 日期格式加上指定月数(一个期限)得到一个新日期的实现代码

    这篇文章主要介绍了Java 日期格式加上指定月数(一个期限)得到一个新日期的实现代码,需要的朋友可以参考下
    2018-05-05
  • 新手入门Jvm--jvm概览

    新手入门Jvm--jvm概览

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
    2021-06-06
  • 实例讲解Java基础之反射

    实例讲解Java基础之反射

    今天小编就为大家分享一篇关于实例讲解Java基础之反射,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • java的==运算符和equals操作详解

    java的==运算符和equals操作详解

    在Java中,==和equals都是用于比较两个对象的操作符,但它们的行为和用途有所不同,这篇文章主要介绍了java的==运算符和equals的相关知识,需要的朋友可以参考下
    2024-08-08

最新评论