Java實現(xiàn)限制文件上傳類型功能
在 Java 的 Web 后端(如 Spring Boot)中,限制文件上傳類型通常通過判斷 MultipartFile 的 Content-Type(MIME 類型)或文件擴展名(后綴名)來實現(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);
}
}
二、實戰(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 來校驗:
@Autowired
private FileConfig fileConfig;
if (!fileConfig.getAllowedTypes().contains(contentType)) {
throw new IllegalArgumentException("不支持的文件類型");
}
四、其他建議
| 場景 | 建議 |
|---|---|
| 前端限制文件選擇 | <input accept="image/*"> |
| 后端強校驗必不可少 | 防止繞過前端 |
| 存儲前統(tǒng)一重命名處理 | 防止惡意腳本如 xx.jpg.exe |
| 加白名單優(yōu)于黑名單 | 拒絕所有不認(rèn)識的類型 |
到此這篇關(guān)于Java實現(xiàn)限制文件上傳類型功能的文章就介紹到這了,更多相關(guān)Java限制文件上傳類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決 java: 程序包com.baomidou.mybatisplus.annotation不存在
在使用Java編寫程序時,經(jīng)常會遇到各種編譯錯誤或運行時異常,本文主要介紹了解決java:程序包com.baomidou.mybatisplus.annotation不存在,具有一定的參考價值,感興趣的可以了解一下2024-03-03
Java Web項目中實現(xiàn)文件下載功能的實例教程
這篇文章主要介紹了Java Web項目中實現(xiàn)文件下載功能的實例教程,分別講解了通過超鏈接實現(xiàn)下載以及通過Servlet程序?qū)崿F(xiàn)下載的方式,需要的朋友可以參考下2016-05-05
SpringBoot+Netty+WebSocket實現(xiàn)消息發(fā)送的示例代碼
這篇文章主要介紹了SpringBoot+Netty+WebSocket實現(xiàn)消息發(fā)送的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
java?Object轉(zhuǎn)Integer實現(xiàn)方式
這篇文章主要介紹了java?Object轉(zhuǎn)Integer實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringMVC Json自定義序列化和反序列化的操作方法
這篇文章主要介紹了SpringMVC Json自定義序列化和反序列化的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

