Java实现限制文件上传类型功能

 更新时间:2025年07月03日 10:33:54   作者:思静鱼  
这篇文章主要为大家详细介绍了在Java中如何实现限制文件上传类型功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

在 Java 的 Web 后端(如 Spring Boot)中,限制文件上传类型通常通过判断 MultipartFile 的 Content-Type(MIME 类型)或文件扩展名(后缀名)来实现。

一、限制文件类型的常见做法

方法 1:根据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 是可能的,因此推荐再结合后缀判断或做文件头检查(Magic Number)

方法 2:根据文件名后缀判断类型(不安全但能挡住大部分无意误传)

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)

每种文件格式都有“魔数”(Magic Number),可使用第三方库如 Apache TikaJMimeMagicFileTypeDetector 来检测。

使用 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);
    }
}

二、实战应用整合到上传接口中(Spring Boot)

@PostMapping("/upload")
public ResponseEntity<?> upload(@RequestParam MultipartFile file) throws IOException {
    validateFileType(file);      // 判断 MIME 类型
    validateExtension(file);     // 判断文件名后缀
    validateByTika(file);        // 推荐:更准确安全

    // 保存逻辑略...
    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/*">
后端强校验必不可少防止绕过前端
存储前统一重命名处理防止恶意脚本如 xx.jpg.exe
加白名单优于黑名单拒绝所有不认识的类型

到此这篇关于Java实现限制文件上传类型功能的文章就介绍到这了,更多相关Java限制文件上传类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用@Cacheable缓存解决双冒号::的问题

    使用@Cacheable缓存解决双冒号::的问题

    这篇文章主要介绍了使用@Cacheable缓存解决双冒号::的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 解决 java: 程序包com.baomidou.mybatisplus.annotation不存在

    解决 java: 程序包com.baomidou.mybatisplus.annotation不存在

    在使用Java编写程序时,经常会遇到各种编译错误或运行时异常,本文主要介绍了解决java:程序包com.baomidou.mybatisplus.annotation不存在,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 如何将maven项目划分为多个模块

    如何将maven项目划分为多个模块

    这篇文章主要介绍了如何将maven项目划分为多个模块,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • java实现联机五子棋

    java实现联机五子棋

    这篇文章主要为大家详细介绍了java实现联机五子棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java Web项目中实现文件下载功能的实例教程

    Java Web项目中实现文件下载功能的实例教程

    这篇文章主要介绍了Java Web项目中实现文件下载功能的实例教程,分别讲解了通过超链接实现下载以及通过Servlet程序实现下载的方式,需要的朋友可以参考下
    2016-05-05
  • JAVA 根据Url把多文件打包成ZIP下载实例

    JAVA 根据Url把多文件打包成ZIP下载实例

    这篇文章主要介绍了JAVA 根据Url把多文件打包成ZIP下载的相关资料,需要的朋友可以参考下
    2017-08-08
  • SpringBoot如何通过配置禁用swagger

    SpringBoot如何通过配置禁用swagger

    这篇文章主要给大家介绍了关于SpringBoot如何通过配置禁用swagger的相关资料,Swagger用来在开发阶段方便前后端分离的项目实战中,提高前后端人员的工作效率,降低交流成本,但是版本上线之后要是把Swagger带上去会存在很大的风险,需要的朋友可以参考下
    2023-08-08
  • SpringBoot+Netty+WebSocket实现消息发送的示例代码

    SpringBoot+Netty+WebSocket实现消息发送的示例代码

    这篇文章主要介绍了SpringBoot+Netty+WebSocket实现消息发送的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java Object转Integer实现方式

    java Object转Integer实现方式

    这篇文章主要介绍了java Object转Integer实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringMVC Json自定义序列化和反序列化的操作方法

    SpringMVC Json自定义序列化和反序列化的操作方法

    这篇文章主要介绍了SpringMVC Json自定义序列化和反序列化的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论