向我的spring启动应用程序提交数据时,必需的字符串参数'file'不存在()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向我的spring启动应用程序提交数据时,必需的字符串参数'file'不存在()相关的知识,希望对你有一定的参考价值。

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

    @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]

Post Man Error

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

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

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

使用Spring Boot 2.1.2.RELEASE版。

答案

我在方法参数中使用了@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看起来不太对劲。

edit

我刚刚注意到你有一些标题集。如果它的Content-Type设置为Multipart,那么请删除它,因为它可能导致和多部分文件边界的异常。邮差将自己处理它。

另一答案

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

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

如果您想设计API端点以将摘要设置为可选,则设置@RequestParam(required = false)

处理文件上传

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

docs for @RequestPart

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

另请参见Spring-Boot Docs,版本2.1.2,第78.5节Handling Multipart File Uploads

以上是关于向我的spring启动应用程序提交数据时,必需的字符串参数'file'不存在()的主要内容,如果未能解决你的问题,请参考以下文章

仅当使用引导程序填写所有必需的 attr 字段时,如何提交表单?

Spring 和 Thymeleaf:将对象从 th:each 表发送到控制器

Spring Boot 轮播全屏 html,css,bootstrap

Spring Boot - 等待 Web 服务器启动

每当我将 @Component 添加到我的 Spring 程序时,启动都不会启动

MySQL启动时必需到usr/local/mysql目录的问题解决方法