最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中驗(yàn)證用戶上傳的圖片資源的方法

 更新時(shí)間:2021年09月29日 11:43:12   作者:SpringBoot中文社區(qū)  
這篇文章主要介紹了在SpringBoot中驗(yàn)證用戶上傳的圖片資源,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

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

這種方式比較常見,也很簡單,是目前大多數(shù)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 方法會(huì)自動(dòng)關(guān)閉流資源
	FileCopyUtils.copy(multipartFile.getInputStream(), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));
	
	// 返回相對(duì)訪問路徑,文件名極有可能帶中文或者空格等字符,進(jìn)行uri編碼
	return  "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);
}

使用 ImageIO 判斷是否是圖片

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

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;
	}
	
	// 臨時(shí)文件
	File tempFile = new File(System.getProperty("java.io.tmpdir"), fileName);
	
	try {
		// 先把文件序列化到臨時(shí)目錄
		multipartFile.transferTo(tempFile);
		try {
			// 嘗試IO文件,判斷文件的合法性
			BufferedImage  bufferedImage = ImageIO.read(tempFile);
			bufferedImage.getWidth();
			bufferedImage.getHeight();
		} catch (Exception e) {
			// IO異常,不是合法的圖片文件,返回異常信息
			return "文件不是圖片文件";
		}
		// 復(fù)制到到上傳目錄
		FileCopyUtils.copy(new FileInputStream(tempFile), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));
		// 返回相對(duì)訪問路徑
		return  "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);
	} finally {
		// 響應(yīng)客戶端后,始終刪除臨時(shí)文件
		tempFile.delete();
	}
}

總結(jié)

使用ImageIo的方式更為保險(xiǎn),但是需要多幾次IO操作。比較消耗性能。而且今天APP大都是用云存儲(chǔ)服務(wù),類似于阿里云的OSS。直接就把客戶端上傳的文件PUT到了云端,才不管用戶上傳的圖片是不是真正的圖片,非法上傳,最多導(dǎo)致客戶端不能顯示而已,但是威脅不了服務(wù)器的安全。

原文:https://springboot.io/t/topic/2231

到此這篇關(guān)于在SpringBoot中驗(yàn)證用戶上傳的圖片資源的文章就介紹到這了,更多相關(guān)SpringBoot驗(yàn)證用戶上傳的圖片資源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?@Accessors注解圖文詳解

    Java?@Accessors注解圖文詳解

    @Accessors用于改變@Data生成的getter和setter方法的生成結(jié)果,下面這篇文章主要給大家介紹了關(guān)于Java?@Accessors注解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 深入理解springboot中配置文件application.properties

    深入理解springboot中配置文件application.properties

    本文主要介紹了springboot中配置文件application.properties,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Spring源碼解析之Configuration

    Spring源碼解析之Configuration

    今天帶大家來學(xué)習(xí)Java Spring相關(guān)知識(shí),文中對(duì)Configuration源碼介紹的非常詳細(xì),有非常多的圖文解說及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java中的異常處理(try,catch,finally,throw,throws)

    Java中的異常處理(try,catch,finally,throw,throws)

    本文主要介紹了Java中的異常處理,文章主要介紹的異常處理包括5個(gè)關(guān)鍵字try,catch,finally,throw,throws,更多詳細(xì)內(nèi)容需要的朋友可以參考一下
    2022-06-06
  • 最新評(píng)論

    个旧市| 岑巩县| 布拖县| 雅安市| 时尚| 额济纳旗| 新乡县| 赤水市| 沙雅县| 石渠县| 三明市| 东辽县| 景谷| 黄大仙区| 哈巴河县| 普格县| 怀化市| 高唐县| 平果县| 会理县| 抚州市| 金寨县| 宽城| 中牟县| 壶关县| 张家界市| 合肥市| 泸水县| 六枝特区| 左权县| 商丘市| 科技| 昌邑市| 罗甸县| 卓资县| 随州市| 酒泉市| 盱眙县| 永平县| 佛坪县| 泰兴市|