Java Springboot如何基於圖片生成下載連結
阿新 • • 發佈:2020-03-30
現有一些圖片在伺服器上的連結,在瀏覽器中開啟這些連結是直接顯示在瀏覽器頁面的形式。
現在需要生成這些圖片的單獨下載以及打包下載連結,即在瀏覽器中開啟下載連結後彈出下載框提示下載。由於前端存在跨域問題,所以圖片下載由後臺介面完成。
首先編寫檔案下載工具類:
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列表",dataType = "List",}) @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),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,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請求,所以也是拼接介面路由+引數,用瀏覽器開啟就能彈出下載。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。