开发者

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

目录
  • 一、限制文件类型的常见做法
    • 方法 1:根据MultipartFile.getContentType()判断 MIME 类型
    • 方法 2:根据文件名后缀判断类型(不安全但能挡住大部分无意误传)
    • 方法 3:安全性更高 —— 检查文件头(Magic Number)
  • 二、实战应用整合到上传接口中(Spring Boot)
    • 三、可配置化(支持配置文件控制允许类型)
      • application.yml
      • 配置类注入
    • 四、其他建议

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

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

      方法 1:根据MultipartFile.getContentType()判断 MIME 类型

      pubjslic 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 = Lisphpt.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);     // 判断文件名后缀
          validateByTikwww.devze.coma(file);        // 推荐:更准确安全
      
          // 保存逻辑略...
          return ResponseEntity.ok("上传成功");
      }
      

      三、可配置化(支持配置文件控制允许类型)

      application.yml

      file:
        al编程lowed-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("不支持的文件类型");
      }
      

      四、其他建议

      场景建议
      前端限制文件选择<inhttp://www.devze.comput accept="image/*">
      后端强校验必不可少防止绕过前端
      存储前统一重命名处理防止恶意脚本如 xx.jpg.exe
      加白名单优于黑名单拒绝所有不认识的类型

      到此这篇关于Java实现限制文件上传类型功能的文章就介绍到这了,更多相关Java限制文件上传类型内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜