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

网友投稿 501 2022-12-10


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();

}

FileUthttp://ils.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;

/**

* 单张图片下载

*

http:// * @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 BufferPXrauGIIOedInputStream(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.getCanonicalPathhttp://();

// 下载文件

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring注解@Scope原理及用法解析
下一篇:Java string类型转换成map代码实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~