时间:2021-05-20
现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式。
现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载。由于前端存在跨域问题,所以图片下载由后台接口完成。
首先编写文件下载工具类:
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请求,所以也是拼接接口路由+参数,用浏览器打开就能弹出下载。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
目的官方的Drools范例大都是基于纯Java项目或Maven项目,而基于SpringBoot项目的很少。本文介绍如何在SpringBoot项目上加上Drool
使用SpringBoot实现excel生成和下载,生成模板如下controller@RequestMapping(value={"/downloadExcelT
一、jeecg-boot整体介绍JeecgBoot是一款基于SpringBoot+代码生成器的快速开发平台,采用前后端分离架构:SpringBoot,Mybat
工作中用springboot搭建项目,用dubbo做远程调用。springboot提倡注解配置和java配置,本文是基于dubbo最新版本2.6.3,使用注解方
一、概述批量下载图片是我们在日常开发中经常会遇到的一个需求,这不,最近工作中就需要批量下载图片到本地,先是通过Excel拼接生成了所有链接地址,然后想到的是通过