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
相关产品推荐
相关产品推荐

