You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot实现仅允许上传PDF与DOCX文件的方法

实现仅接受PDF和DOCX文件的上传限制

你可以通过以下几种方式给上传接口添加格式限制,从简单到严谨的方案都有:

1. 检查文件名后缀(快速实现)

直接通过文件名的后缀判断格式,这种方式简单直观,注意兼容大小写(比如.PDF或.DOCX):

修改上传方法,在调用fileService.store(file)前添加判断逻辑:

@PostMapping("/upload")
public ResponseEntity<ResponseMessage> uploadFile (@RequestParam("file") MultipartFile file){
    String message = "";
    try {
        String fileName = file.getOriginalFilename();
        // 检查文件名后缀是否为PDF或DOCX(忽略大小写)
        if (fileName == null || !(fileName.toLowerCase().endsWith(".pdf") || fileName.toLowerCase().endsWith(".docx"))) {
            message = "仅支持PDF和DOCX格式的文件: " + fileName;
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseMessage(message));
        }
        
        fileService.store(file);
  
        message = "Uploaded the file successfully: " + file.getOriginalFilename();
        return ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage(message));
    } catch (Exception e) {
        message = "Could not upload the file: " + file.getOriginalFilename() + "!";
        return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ResponseMessage(message));
    }
}

2. 验证文件MIME类型(更可靠)

文件名后缀可能被篡改,检查文件的MIME类型更严谨。PDF的标准MIME类型是application/pdf,DOCX是application/vnd.openxmlformats-officedocument.wordprocessingml.document:

@PostMapping("/upload")
public ResponseEntity<ResponseMessage> uploadFile (@RequestParam("file") MultipartFile file){
    String message = "";
    try {
        String contentType = file.getContentType();
        // 验证MIME类型
        if (!"application/pdf".equals(contentType) && !"application/vnd.openxmlformats-officedocument.wordprocessingml.document".equals(contentType)) {
            message = "仅支持PDF和DOCX格式的文件,当前文件类型: " + contentType;
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseMessage(message));
        }
        
        fileService.store(file);
  
        message = "Uploaded the file successfully: " + file.getOriginalFilename();
        return ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage(message));
    } catch (Exception e) {
        message = "Could not upload the file: " + file.getOriginalFilename() + "!";
        return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ResponseMessage(message));
    }
}

3. 结合Spring注解全局拦截(规范做法)

利用Spring的注解直接限制允许的媒体类型,Spring会在请求进入方法前就拦截不符合要求的文件:

// 指定接口仅接受multipart/form-data类型请求,且文件只能是PDF或DOCX
@PostMapping(value = "/upload", consumes = "multipart/form-data")
public ResponseEntity<ResponseMessage> uploadFile (
    @RequestParam(value = "file", required = true, 
                  consumes = {"application/pdf", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}) 
    MultipartFile file){
    String message = "";
    try {
        fileService.store(file);
  
        message = "Uploaded the file successfully: " + file.getOriginalFilename();
        return ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage(message));
    } catch (Exception e) {
        message = "Could not upload the file: " + file.getOriginalFilename() + "!";
        return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ResponseMessage(message));
    }
}

4. 双重验证(最高安全性)

如果需要更严格的校验,可以同时结合文件名后缀和MIME类型检查,甚至可以读取文件头信息确认真实格式(比如PDF文件头是%PDF-,DOCX基于ZIP格式,可检查内部结构),大部分场景下前两种结合就足够。

内容的提问来源于stack exchange,提问作者hamza houri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:09:26