【问题标题】:Required String parameter 'file' is not present () when submitting data to my springboot app将数据提交到我的springboot应用程序时,所需的字符串参数'file'不存在()
【发布时间】:2019-07-02 11:08:52
【问题描述】:

在我的控制器中,我有这个接收数据的方法

    @RequestMapping(path = "/takemyvid", method = RequestMethod.POST)
    public String upload2(@RequestParam("summary") String summary, @RequestPart("file") MultipartFile file) {
    System.out.println(file);
    System.out.println(summary);
    return "";
}

但是当我用正确的参数用邮递员测试它时,我得到一个错误

Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'summary' is not present]

即使我只包含文件也会发生这种情况。

我已经在属性文件中设置了最大文件大小。

spring.servlet.multipart.max-file-size=128MB
spring.servlet.multipart.max-request-size=128MB

使用 Spring Boot 版本 2.1.2.RELEASE。

【问题讨论】:

  • 这仅适用于一个字符串参数,请问您能用我的例子给我看吗?
  • 请同时发布您的请求标头(在邮递员中设置)。它们将影响 Spring 如何处理/转换请求参数/正文。见Postman - Required MultipartFile parameter is not present - Spring, Java
  • 你试过我的解决方案了吗?它起作用了吗? @IsaacK
  • @Pijotrek,感谢您的回答,但属性为空,因此记录器行抛出空指针异常。
  • 您是否使用 getter 和 setter 创建了 Dto 类?您确定字段名称与您在 Postman 中发送的名称相同吗?我尝试了我的解决方案,效果很好

标签: spring spring-boot file-upload multipartform-data


【解决方案1】:

我在方法参数中使用了@ModelAttribute注解:

@RestController
public class UploadController {
    private static final Logger logger = LoggerFactory.getLogger(UploadController.class);

    @RequestMapping(path = "/takemyvid", method = RequestMethod.POST)
    public void upload2(@ModelAttribute FileUploadDto fileUploadDto) {
        logger.info("File uploaded, summary = {}, fileSize = {} bytes", fileUploadDto.getSummary(), fileUploadDto.getFile().getSize());
    }

}

我还创建了这样的 Dto 类:

public class FileUploadDto {

    private String summary;
    private MultipartFile file;
    //getters, setters, whatevers [...]
}

这样它应该可以工作,但您应该考虑更好地为您的端点命名。 takemyvid 看起来不太对。

编辑

我刚刚注意到您设置了一些标题。如果将 Content-Type 设置为 Multipart,请删除它,因为它可能会导致关于 multipart 文件边界的异常。邮递员会自己处理。

【讨论】:

  • 超级建议!从设计的角度来看,这个单个 DTO 参数(有助于进一步处理)以及 面向资源的 URL-重新设计(例如 POST/videos/videos/uploads - 揭示端点的意图)都强烈推荐。
  • 感谢大家的建议,暂时不用担心端点的名称,@Pijotrek,它在访问对象属性时会抛出空指针异常
【解决方案2】:

处理必需的 VS 可选的请求参数

消息Required String parameter 'summary' is not present 显示,您的@RequestParam String summary 默认为required = true - 请参阅java-docs

如果您希望将 API 端点设计为将 summary 设为 optional,请设置 @RequestParam(required = false)

处理文件上传

由于您使用的是表单(键值对),我建议使用 @RequestParam 注释 file 参数,并让 Spring 处理转换为指定参数类型 MultipartFile

docs for @RequestPart

请注意,@RequestParam 注释也可用于将“multipart/form-data”请求的部分与支持相同方法参数类型的方法参数相关联。主要区别在于,当方法参数不是 String 或原始 MultipartFile / Part 时,@RequestParam 依赖于通过注册的 Converter 或 PropertyEditor 进行类型转换,而 RequestPart 依赖于 HttpMessageConverters 考虑到请求部分的“Content-Type”标头. RequestParam 可能与 name-value 表单字段 一起使用,而 RequestPart 可能与包含更复杂内容的部分一起使用,例如JSON、XML)。

另请参阅 Spring-Boot 文档,版本 2.1.2,第 78.5 节 Handling Multipart File Uploads

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2021-04-01
    • 2021-04-12
    • 2013-08-01
    相关资源
    最近更新 更多