Java實(shí)現(xiàn)限制文件上傳類型功能
在 Java 的 Web 后端(如 Spring Boot)中,限制文件上傳類型通常通過判斷 MultipartFile 的 Content-Type(MIME 類型)或文件擴(kuò)展名(后綴名)來實(shí)現(xiàn)。
一、限制文件類型的常見做法
方法 1:根據(jù)MultipartFile.getContentType()判斷 MIME 類型
public void validateFileType(MultipartFile file) {
List<String> allowedTypes = List.of("image/png", "image/jpeg", "application/pdf");
String contentType = file.getContentType();
if (!allowedTypes.contains(contentType)) {
throw new IllegalArgumentException("不支持的文件類型: " + contentType);
}
}
注意:瀏覽器偽造 Content-Type 是可能的,因此推薦再結(jié)合后綴判斷或做文件頭檢查(Magic Number)
方法 2:根據(jù)文件名后綴判斷類型(不安全但能擋住大部分無意誤傳)
public void validateExtension(MultipartFile file) {
String filename = file.getOriginalFilename().toLowerCase();
List<String> allowedExtensions = List.of(".jpg", ".jpeg", ".png", ".pdf");
if (allowedExtensions.stream().noneMatch(filename::endsWith)) {
throw new IllegalArgumentException("不支持的文件后綴");
}
}
方法 3:安全性更高 —— 檢查文件頭(Magic Number)
每種文件格式都有“魔數(shù)”(Magic Number),可使用第三方庫如 Apache Tika、JMimeMagic、FileTypeDetector 來檢測。
使用 Apache Tika 示例:
import org.apache.tika.Tika;
public void validateByTika(MultipartFile file) throws IOException {
Tika tika = new Tika();
String detectedType = tika.detect(file.getInputStream());
List<String> allowedTypes = List.of("image/jpeg", "image/png", "application/pdf");
if (!allowedTypes.contains(detectedType)) {
throw new IllegalArgumentException("文件類型不合法: " + detectedType);
}
}
二、實(shí)戰(zhàn)應(yīng)用整合到上傳接口中(Spring Boot)
@PostMapping("/upload")
public ResponseEntity<?> upload(@RequestParam MultipartFile file) throws IOException {
validateFileType(file); // 判斷 MIME 類型
validateExtension(file); // 判斷文件名后綴
validateByTika(file); // 推薦:更準(zhǔn)確安全
// 保存邏輯略...
return ResponseEntity.ok("上傳成功");
}
三、可配置化(支持配置文件控制允許類型)
application.yml
file:
allowed-types:
- image/png
- image/jpeg
- application/pdf
配置類注入
@ConfigurationProperties(prefix = "file")
@Data
public class FileConfig {
private List<String> allowedTypes;
}
再注入 FileConfig 來校驗(yàn):
@Autowired
private FileConfig fileConfig;
if (!fileConfig.getAllowedTypes().contains(contentType)) {
throw new IllegalArgumentException("不支持的文件類型");
}
四、其他建議
| 場景 | 建議 |
|---|---|
| 前端限制文件選擇 | <input accept="image/*"> |
| 后端強(qiáng)校驗(yàn)必不可少 | 防止繞過前端 |
| 存儲前統(tǒng)一重命名處理 | 防止惡意腳本如 xx.jpg.exe |
| 加白名單優(yōu)于黑名單 | 拒絕所有不認(rèn)識的類型 |
到此這篇關(guān)于Java實(shí)現(xiàn)限制文件上傳類型功能的文章就介紹到這了,更多相關(guān)Java限制文件上傳類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis直接執(zhí)行SQL的工具SqlMapper
今天小編就為大家分享一篇關(guān)于MyBatis直接執(zhí)行SQL的工具SqlMapper,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Java自定義類數(shù)組報null的相關(guān)問題及解決
這篇文章主要介紹了Java自定義類數(shù)組報null的相關(guān)問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
Java線程安全和鎖Synchronized知識點(diǎn)詳解
在本篇文章里小編給大家分享的是關(guān)于Java線程安全和鎖Synchronized相關(guān)知識點(diǎn),有需要的朋友們可以參考下。2019-08-08
Java代碼實(shí)現(xiàn)哈希表(google 公司的上機(jī)題)
這篇文章主要介紹了Java 哈希表詳解(google 公司的上機(jī)題),本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
關(guān)于springboot配置druid數(shù)據(jù)源不生效問題(踩坑記)
今天日常跟著網(wǎng)課學(xué)習(xí),學(xué)到了整合druid數(shù)據(jù)源,遇到了好幾個坑,希望這篇文章可以幫助一些和我一樣踩坑的人2021-09-09
SpringBoot項(xiàng)目啟動時預(yù)加載操作方法
Spring Boot是一種流行的Java開發(fā)框架,它提供了許多方便的功能來簡化應(yīng)用程序的開發(fā)和部署,這篇文章主要介紹了SpringBoot項(xiàng)目啟動時預(yù)加載,需要的朋友可以參考下2023-09-09

