欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中驗證用戶上傳的圖片資源的方法

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

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

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

這種方式比較常見,也很簡單,是目前大多數(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 方法會自動關閉流資源
	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類去加載圖片,嘗試讀取其寬高信息,如果不是合法的圖片資源。則無法讀取到這兩個數(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;
	}
	
	// 臨時文件
	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();
	}
}

總結

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

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

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

相關文章

  • Gradle構建多模塊項目的方法步驟

    Gradle構建多模塊項目的方法步驟

    這篇文章主要介紹了Gradle構建多模塊項目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 關于bigDecimal類的精度保留方法

    關于bigDecimal類的精度保留方法

    這篇文章主要介紹了關于bigDecimal類的精度保留方法,計算機存儲的浮點數(shù)受存儲bit位數(shù)影響,只能保證一定范圍內(nèi)精準,超過bit范圍的只能取近似值,Java使用java.math.BigDecimal專門處理小數(shù)精度,需要的朋友可以參考下
    2023-07-07
  • SpringBoot使用@NotEmpty、@NotBlank、@NotNull注解進行參數(shù)校驗

    SpringBoot使用@NotEmpty、@NotBlank、@NotNull注解進行參數(shù)校驗

    我們經(jīng)常需要對請求參數(shù)進行校驗,本文主要介紹了SpringBoot使用@NotEmpty、@NotBlank、@NotNull注解進行參數(shù)校驗,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • java圖片識別文字的方法

    java圖片識別文字的方法

    這篇文章主要為大家詳細介紹了java圖片識別文字的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 10個經(jīng)典的Java main方法面試題

    10個經(jīng)典的Java main方法面試題

    這篇文章主要為大家分享了10個經(jīng)典的Java main方法面試題,與其說是Java面試題,其實也是Java的一些最基礎知識問題,感興趣的小伙伴們可以參考一下
    2016-01-01
  • ?java中Thread.sleep()的具體使用

    ?java中Thread.sleep()的具體使用

    本文主要介紹了?java中Thread.sleep()的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 詳細解析Java中抽象類和接口的區(qū)別

    詳細解析Java中抽象類和接口的區(qū)別

    這篇文章主要介紹了Java中抽象類和接口的區(qū)別詳解,需要的朋友可以參考下
    2014-10-10
  • JavaIO模型中的BIO,NIO和AIO詳解

    JavaIO模型中的BIO,NIO和AIO詳解

    這篇文章主要為大家詳細介紹了JavaIO模型中的BIO,NIO和AIO,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Springboot打包部署修改配置文件的方法

    Springboot打包部署修改配置文件的方法

    這篇文章主要介紹了Springboot打包部署修改配置文件的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 基于Session的國際化實現(xiàn)方法

    基于Session的國際化實現(xiàn)方法

    下面小編就為大家?guī)硪黄赟ession的國際化實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08

最新評論