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限制文件上传类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis直接执行SQL的工具SqlMapper

    MyBatis直接执行SQL的工具SqlMapper

    今天小编就为大家分享一篇关于MyBatis直接执行SQL的工具SqlMapper,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringBoot整合MyBatis的代码详解

    SpringBoot整合MyBatis的代码详解

    这篇文章主要介绍了SpringBoot整合MyBatis笔记记录,大家需要注意在整合mybatis之前我们需要相对应的导入相关依赖,首先需要在java的目录和resources下创建mapper文件夹,对SpringBoot整合MyBatis的详细过程感兴趣的朋友一起看看吧
    2022-05-05
  • Java自定义类数组报null的相关问题及解决

    Java自定义类数组报null的相关问题及解决

    这篇文章主要介绍了Java自定义类数组报null的相关问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Netty内存池泄漏问题以解决方案

    Netty内存池泄漏问题以解决方案

    这篇文章主要介绍了Netty内存池泄漏问题以解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java线程安全和锁Synchronized知识点详解

    Java线程安全和锁Synchronized知识点详解

    在本篇文章里小编给大家分享的是关于Java线程安全和锁Synchronized相关知识点,有需要的朋友们可以参考下。
    2019-08-08
  • Java代码实现哈希表(google 公司的上机题)

    Java代码实现哈希表(google 公司的上机题)

    这篇文章主要介绍了Java 哈希表详解(google 公司的上机题),本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 关于springboot配置druid数据源不生效问题(踩坑记)

    关于springboot配置druid数据源不生效问题(踩坑记)

    今天日常跟着网课学习,学到了整合druid数据源,遇到了好几个坑,希望这篇文章可以帮助一些和我一样踩坑的人
    2021-09-09
  • SpringBoot访问windows共享文件的方法

    SpringBoot访问windows共享文件的方法

    这篇文章主要介绍了SpringBoot访问windows共享文件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用windows共享功能进行文件传输,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Java设计模式之Iterator模式介绍

    Java设计模式之Iterator模式介绍

    所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式。本文以java中的容器为例,模拟Iterator的原理。需要的朋友可以参考下
    2013-07-07
  • SpringBoot项目启动时预加载操作方法

    SpringBoot项目启动时预加载操作方法

    Spring Boot是一种流行的Java开发框架,它提供了许多方便的功能来简化应用程序的开发和部署,这篇文章主要介绍了SpringBoot项目启动时预加载,需要的朋友可以参考下
    2023-09-09

最新评论