91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot中如何驗證用戶上傳的圖片資源

發布時間:2021-09-29 13:41:44 來源:億速云 閱讀:231 作者:小新 欄目:開發技術

小編給大家分享一下SpringBoot中如何驗證用戶上傳的圖片資源,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

允許用戶上傳圖片資源(頭像,發帖)是APP常見的需求,特別需要把用戶的資源IO到磁盤情況下,需要防止壞人提交一些非法的文件,例如木馬,webshell,可執行程序等等。這類非法文件不僅會導致客戶端圖片資源顯示失敗,而且還會給服務器帶來安全問題。

通過文件后綴判斷文件的合法性

這種方式比較常見,也很簡單,是目前大多數APP選擇的做法。

public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalStateException, IOException {
	
	// 原始文件名稱
	String fileName = multipartFile.getOriginalFilename();
	
	// 解析到文件后綴,判斷是否合法
	int index = fileName.lastIndexOf(".");
	String suffix = null;
	if (index == -1 || (suffix = fileName.substring(index + 1)).isEmpty()) {
		return "文件后綴不能為空";
	}
	
	// 允許上傳的文件后綴列表
	Set<String> allowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif"));
	if (!allowSuffix.contains(suffix.toLowerCase())) {
		return "非法的文件,不允許的文件類型:" + suffix;
	}
	
	// 序列化到磁盤中的文件上傳目錄, /upload
	// FileCopyUtils.copy 方法會自動關閉流資源
	FileCopyUtils.copy(multipartFile.getInputStream(), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));
	
	// 返回相對訪問路徑,文件名極有可能帶中文或者空格等字符,進行uri編碼
	return  "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);
}

使用 ImageIO 判斷是否是圖片

這個方法就比較嚴格了,在判斷后綴的基礎上,使用Java的ImageIO類去加載圖片,嘗試讀取其寬高信息,如果不是合法的圖片資源。則無法讀取到這兩個數據。就算是把非法文件修改了后綴,也可以檢測出來。

public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalStateException, IOException {
	
	// 原始文件名稱
	String fileName = multipartFile.getOriginalFilename();
	
	// 解析到文件后綴
	int index = fileName.lastIndexOf(".");
	String suffix = null;
	if (index == -1 || (suffix = fileName.substring(index + 1)).isEmpty()) {
		return "文件后綴不能為空";
	}
	
	// 允許上傳的文件后綴列表
	Set<String> allowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif"));
	if (!allowSuffix.contains(suffix.toLowerCase())) {
		return "非法的文件,不允許的文件類型:" + suffix;
	}
	
	// 臨時文件
	File tempFile = new File(System.getProperty("java.io.tmpdir"), fileName);
	
	try {
		// 先把文件序列化到臨時目錄
		multipartFile.transferTo(tempFile);
		try {
			// 嘗試IO文件,判斷文件的合法性
			BufferedImage  bufferedImage = ImageIO.read(tempFile);
			bufferedImage.getWidth();
			bufferedImage.getHeight();
		} catch (Exception e) {
			// IO異常,不是合法的圖片文件,返回異常信息
			return "文件不是圖片文件";
		}
		// 復制到到上傳目錄
		FileCopyUtils.copy(new FileInputStream(tempFile), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));
		// 返回相對訪問路徑
		return  "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);
	} finally {
		// 響應客戶端后,始終刪除臨時文件
		tempFile.delete();
	}
}

以上是“SpringBoot中如何驗證用戶上傳的圖片資源”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳山县| 益阳市| 进贤县| 灵川县| 垣曲县| 洪泽县| 东乌珠穆沁旗| 连平县| 古丈县| 高州市| 梓潼县| 临泽县| 麦盖提县| 曲阜市| 渑池县| 竹溪县| 洛阳市| 福鼎市| 东宁县| 手游| 大荔县| 虞城县| 宣化县| 会理县| 招远市| 泾阳县| 海城市| 普宁市| 察隅县| 满洲里市| 平罗县| 额济纳旗| 水富县| 安国市| 龙井市| 阳朔县| 周至县| 潞西市| 郯城县| 抚顺市| 个旧市|