前言
啊啊啊,一些工做上遇到的一些問題,記錄下來,方便之後查看吧,也但願能幫助到你們,因此就打算歸類到springboot 番外篇了。html
好了,廢話很少說,最近要作一個功能,客戶端上傳圖片到服務端,再從服務端經過文件名下載文件。其實最好的靜態文件最好仍是經過nginx 獲取比較快,可是因爲想要作一個縮略圖的效果,其實縮略圖在前端也能夠作,可是任務安排下來了那就作吧。前端
也考慮在上傳文件的時候若是是圖片就生成一個縮略圖,可是這個功能以前上線過一次,以前有的圖片就沒有很好的辦法生成縮略圖了,因此就成了在下載的時候來生成縮略圖。實現方案以下:nginx
引入依賴
在pom.xml 文件中引入以下依賴:程序員
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
ImageUtil
咱們建立一個 ImageUtil 工具類。內容以下:web
public class ImageUtil {
/**
* 按尺寸原比例縮放圖片
* @param source 輸入源
* @param output 輸出源
* @param width 256
* @param height 256
* @throws IOException
*/
public static void imgThumb(String source, String output, int width, int height) throws IOException {
Thumbnails.of(source).size(width, height).toFile(output);
}
/**
* 按照比例進行縮放
* @param source 輸入源
* @param output 輸出源
* @param scale 比例
* @throws IOException
*/
public static void imgScale(String source, String output, double scale) throws IOException {
Thumbnails.of(source).scale(scale).toFile(output);
}
}
主要就是使用到Thumbnails 實現按像素壓縮和按比例壓縮,這兩種方法都是縮略後保持原比例的不會失真變形的,算是比較經常使用的了,固然 Thumbnails 還有其餘的功能,感興趣的能夠搜索學習一下。spring
下載的接口
建立一個DownloadFileConfig 類,內容以下:springboot
@RestController
@RequestMapping("/config")
public class DownloadFileConfig {
private static final Logger log = LoggerFactory.getLogger(DateUtils.class);
private static final String WEBAPPPATH = PathUtil.getRootPath() + ConstantPool.ANNEX;
@RequestMapping("/download")
public String fileDownLoad(HttpServletResponse response, @RequestParam("annexName") String annexName, @RequestParam("type") String type){
String totalUrl = WEBAPPPATH +annexName;
String output=totalUrl;
String fileName=annexName;
if(type.equals(ConstantPool.THUMBNAIL) &&
(annexName.contains(ConstantPool.SEPARATORBMP)
|| annexName.contains(ConstantPool.SEPARATORGIF)
|| annexName.contains(ConstantPool.SEPARATORPNG)
|| annexName.contains(ConstantPool.SEPARATORJPEG)
|| annexName.contains(ConstantPool.SEPARATORJPG)
|| annexName.contains(ConstantPool.SEPARATORWEBP))
){
int index=annexName.lastIndexOf(ConstantPool.SEPARATORPOINT);
fileName=annexName.substring(0,index)+type+annexName.substring(index);
output=WEBAPPPATH+fileName;
try {
ImageUtil.imgThumb(totalUrl,output,ConstantPool.WIDTH,ConstantPool.HEIGHT);
} catch (IOException e) {
e.printStackTrace();
}
}
int index=fileName.indexOf(ConstantPool.SEPARATORSLASH);
String downloadFileName =fileName.substring(index+1);
log.info(output);
File file = new File(output);
if(!file.exists()){
return "下載文件不存在";
}
response.reset();
response.setContentType("application/octet-stream");
response.setCharacterEncoding("utf-8");
response.setContentLength((int) file.length());
response.setHeader("Content-Disposition", "attachment;filename="+downloadFileName );
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));) {
byte[] buff = new byte[1024];
OutputStream os = response.getOutputStream();
int i = 0;
while ((i = bis.read(buff)) != -1) {
os.write(buff, 0, i);
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
return "下載失敗";
}
return "下載成功";
}
}
這裏用到常量池,ConstantPool內容以下:微信
public class ConstantPool {
private ConstantPool(){
}
public static final String SEPARATORNULL ="";
public static final String SEPARATORPOINT =".";
public static final String SEPARATORSLASH ="/";
public static final String SEPARATORJPG =".jpg";
public static final String SEPARATORJPEG =".jpeg";
public static final String SEPARATORBMP =".bmp";
public static final String SEPARATORPNG =".png";
public static final String SEPARATORGIF =".gif";
public static final String SEPARATORWEBP =".webp";
public static final String THUMBNAIL ="縮略圖";
public static final int WIDTH =256;
public static final int HEIGHT =256;
}
上面的下載接口,整個邏輯也很簡單,就是先判斷type 傳的是不是縮略圖,若是是則表示是要縮略的圖片,則對圖片進行壓縮後輸出,不然就直接輸出文件。整個就搞定啦~app
測試效果
咱們在寫測試效果的html編輯器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<img data-v-8ecfafb6="" src="http://127.0.0.1:9015/sdrwkb/config/download.mt?annexName=1578444949941/HRZhao頭像.png&type=縮略圖" alt="img">
<img data-v-8ecfafb6="" src="http://127.0.0.1:9015/sdrwkb/config/download.mt?annexName=1578444949941/HRZhao頭像.png&type=" alt="img">
</body>
</html>
效果以下:
番外
寫的比較粗糙,但也比較簡單,但願能幫到你們。
若是你以爲有用,記得收藏喔
本文分享自微信公衆號 - 程序員愛酸奶(cxyisnai)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。