栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

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

public class FileDownloadUtil {

  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;


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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/134666.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号