JAVASpring

Spring Boot对多文件多参数的请求处理记录

项目背景:springboot 项目遇到一个需求,需要上传多个文件及相关参数信息。

工具请求方式:Body里面设置:multipart/form-data

最开始按下面方法定义

    /**
     * 上传文件(新)
     *
     * @param fileUploadReq 附件关联信息
     * @return 结果
     */
    @PostMapping(value = "/file/upload/new", consumes = 
    MediaType.MULTIPART_FORM_DATA_VALUE)
    public R<FileRecord> uploadNew(@RequestBody FileUploadReq fileUploadReq);

会出下面的错误

Content type 'multipart/form-data;boundary=--------------------------789428842947670377098484;charset=UTF-8' not supported

解决方法:


  • 从HttpServletRequest中提取参数
/**
     * 文件上传请求
     */
    @PostMapping("/upload/new")
    public R<FileRecord> uploadNew(HttpServletRequest request) {
        try {
            MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);
            List<MultipartFile> files = ((MultipartHttpServletRequest) request)
                    .getFiles("fileList");
            String relationId = params.getParameter("relationId");
            String relationType = params.getParameter("relationType");
            // 上传并返回访问地址
 
            // TODO
            return R.ok(new FileRecord());
        } catch (Exception e) {
            log.error("上传文件失败", e);
            return R.fail(e.getMessage());
        }
    }
  • 直接用实体接收
/**
     * 文件上传请求
     */
    @PostMapping("/upload/new")
    public R<List<FileRecord>> uploadNew(FileUploadReq fileUploadReq) {
        try {
            // 上传并返回访问地址
            List<FileRecord> fileRecord = sysFileService.uploadFileNew(fileUploadReq);
            return R.ok(fileRecord);
        } catch (Exception e) {
            log.error("上传文件失败", e);
            return R.fail(e.getMessage());
        }
    }

注意:该处不可以用 @RequestBody 注解接收,文件类型请求只能用@RequestPart及@RequestParam注解接收。例如:

  • RequestParam
@PostMapping("/problem")
    public AjaxResult problemReport(@RequestParam("file") List<MultipartFile> files, 
        MaterialTaskProblemReportAddReq problemReportAddReq) {
        reportManager.problemReport(files, problemReportAddReq);
        return AjaxResult.success("新增成功");
    }

虽然这样可以接收到,但这样写即不好理解参数(与请求参数格式不对应),又不简洁。