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

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

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

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

Java Springboot 根据图片链接生成图片下载链接 及 多个图片打包zip下载链接的更多相关文章

  1. 打包zip下载

    //首先引入的文件为org.apache的切记不是jdk的import org.apache.tools.zip.ZipOutputStream;import org.apache.tools.zip ...

  2. 批量下载,多文件压缩打包zip下载

    0.写在前面的话 图片批量下载,要求下载时集成为一个压缩包进行下载.从昨天下午折腾到现在,踩坑踩得莫名其妙,还是来唠唠,给自己留个印象的同时,也希望给需要用到这个方法的人带来一些帮助. 1.先叨叨IO ...

  3. Web端文件打包.zip下载

    使用ant.jar包的API进行文件夹打包.直接上代码: String zipfilename = "test.zip"; File zipfile = new File(zipf ...

  4. 文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

    总结:                                                          使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文: ...

  5. 轻量级JAVA+EE企业应用实战(第4版)pdf电子书和源码的免费下载链接

    轻量级JAVA+EE企业应用实战(第4版)pdf电子书和源码的免费下载链接: pdf链接:https://pan.baidu.com/s/1dYIWtsv2haL4v7vx3w-8WQ 无提取密码源码 ...

  6. java后台中处理图片辅助类汇总(上传图片到服务器,从服务器下载图片保存到本地,缩放图片,copy图片,往图片添加水印图片或者文字,生成二维码,删除图片等)

    最近工作中处理小程序宝箱活动,需要java画海报,所以把这块都快百度遍了,记录一下处理的方法,百度博客上面也有不少坑! 获取本地图片路径: String bgPath = Thread.current ...

  7. Java爬虫之下载全世界国家的国旗图片

    介绍   本篇博客将继续上一篇博客:Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗 的内容,将用Java来实现这个爬虫,下载全世界国家的国旗图片. ...

  8. JAVA根据URL生成二维码图片、根据路径生成二维码图片

    引入jar包 zxing-2.3.0.jar.IKAnalyzer2012_u6.jar 下载地址:https://yvioo.lanzous.com/b00nlbp6h                ...

  9. java springboot调用第三方接口 借助hutoool工具类 爬坑

    楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...

随机推荐

  1. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  2. JUnit——运行多个测试方法

    TDD=Test Drive Development   在实际应用中作用特别大,因为我们会定义很多的类和方法,也会存在很多的更新操作,这样如果用main函数进行测试,则会异常麻烦. 而如果用这种多个 ...

  3. 微信小程序访问后台出现 对应的服务器证书无效。控制台输入 showRequestInfo() 可以获取更详细信息。

    检查微信开发者平台配置 https 服务端 nginx 配置 ssl 协议是否有效 在开发者工具中可以使用(详情 > 不校验合法域名.web-view(业务域名).TLS 版本以及 HTTPS ...

  4. 有色物体检测opencv+python

    import cv2 import numpy as np import matplotlib.pyplot as plt cap=cv2.VideoCapture(0) while(1): ret, ...

  5. Oracle-SQL程序优化4

    从事一年DBA工作,经验尚浅,但是遇到问题总还是能够解决,今天就谈下我遇到的一个比较奇葩的问题. 运维人员告知我下午过后ETL一直卡住没有继续,那时我以为又是什么兼容性问题引起的,就重跑一下ETL,谁 ...

  6. Linux6.6及以上版本配置oracle-ASM共享储存-UDEV-V1

    1,在该路劲下创建50-udev.rules文件,将要创建成ASM设备的裸设备添加进去,并指定OWNER 两个节点进行创建 [root@oraclea rules.d]# pwd/etc/udev/r ...

  7. linux日常---2、lamp.sh安装lamp环境中的linux操作

    linux日常---2.lamp.sh安装lamp环境中的linux操作 一.总结 一句话总结: 学不如用,学一百遍还不如真正多用几遍的来的效果好 1.linux下查看进程命令? ps 常用 ps - ...

  8. oracle之VARCHAR2(50 CHAR) 和VARCHAR2(50) 区别?

      首先要明白的是:根据字符集不同,varchar2(50)这样在gbk可存25个汉字,utf8可存16个汉字 这里的50相当于50BYTE,是按字节计数,50CHAR是按字符计数. 对于多字节字符( ...

  9. 三十八、python中反射介绍

    一.反射:根据字符串的形式去对象(某个模块)中去操作成员通过字符串的形式,导入模块通过字符串的形式,去模块中寻找指定的函数,并执行 1.__import__:用于字符串的形似执行导入模块 inp=in ...

  10. java 8 jdk1.8 新特性

    1Lambda表达式 2函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. java 8为函数式接口引入了一个新注解@Fu ...