软件编程
位置:首页>> 软件编程>> java编程>> Java Springboot如何基于图片生成下载链接

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

作者:NemoWang  发布时间:2023-05-19 19:57:32 

标签:下载,链接,Java,Spring,boot

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

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

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


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

来源:https://www.cnblogs.com/nemowang1996/p/11603848.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com