1. 程式人生 > 程式設計 >Java Springboot如何基於圖片生成下載連結

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();
      }
      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請求,所以也是拼接介面路由+引數,用瀏覽器開啟就能彈出下載。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。