春季文件上传 - '所需的请求部分不存在'

Posted

技术标签:

【中文标题】春季文件上传 - \'所需的请求部分不存在\'【英文标题】:Spring File Upload - 'Required request part is not present'春季文件上传 - '所需的请求部分不存在' 【发布时间】:2018-03-15 17:57:16 【问题描述】:

我正在尝试向我的控制器发送 POST 请求,但无法传递任何类型的任何参数,除非我决定使用 JSON。我的目标是将字符串和文件传递给我的控制器,但我不断收到Required request part 'xxx' is not present 错误。

@RestController
public class ConfigurationController 
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("file") MultipartFile uploadfile)
        return ResponseEntity.ok().body(null);
    

我这里不能有文件。同样,如果我尝试:

@RestController
public class ConfigurationController 
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("name") String name)
        return ResponseEntity.ok().body(null);
    

同样的事情我在这里无法命名。

我正在通过 Postman 发送请求,如下图所示:

唯一的标头标签用于授权。我没有任何 Content-Type 标头,我尝试添加 multipart/form-data 但没有帮助。

我可以传递字符串参数的唯一方法是添加到 URL。所以关注http://localhost:8080/SearchBox/admin/config?name=test 可以,但这不是我想要的。我想要正文部分中的字符串和文件参数。

我也通过 CURL 进行了测试:

curl -X POST -H "Authorization:Bearer myToken" -H "Content-Type:Multipart/form-data" http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -X POST -H "Authorization:Bearer myToken"http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -H "Authorization:Bearer myToken" -F file=@"/g123.conf" http://localhost:8080/SearchBox/admin/config

注意:我已经查看过类似的帖子,但没有帮助 This、This、This

【问题讨论】:

对于其他有类似问题的人,这可能是您正在寻找的解决方案:***.com/questions/40488585/… 您必须在 addConfig 中添加 bean multipartResolver 以防您使用 spring mvc。像这样baeldung.com/spring-file-upload 【参考方案1】:

我终于解决了这个问题并分享了我的解决方案,以防其他人可能面临同样的问题。

@RestController
@RequestMapping("/")
public class ConfigurationController 

    @Bean
    public MultipartConfigElement multipartConfigElement() 
        return new MultipartConfigElement("");
    

    @Bean
    public MultipartResolver multipartResolver() 
        org.springframework.web.multipart.commons.CommonsMultipartResolver multipartResolver = new org.springframework.web.multipart.commons.CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(1000000);
        return multipartResolver;
    
    @PostMapping(value = "/config", consumes = "multipart/form-data")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("password") String password, @RequestParam("file") MultipartFile submissions)
            throws AdminAuthenticationException, ConfigurationException 
        return ResponseEntity.ok().body(null);
    

【讨论】:

这在 Spring 2.0.0 中对我不起作用。事实上,添加这些 bean 会产生该错误。添加 none 不会导致错误。 @Gokhan 你为什么使用 multipartResolver() 和 multipartConfigElement() 方法。 添加@Bean public MultipartConfigElement multipartConfigElement() return new MultipartConfigElement("");并在 Spring Boot 2.1.6 中工作,谢谢! 请您分享此控制器的 Junit 测试用例。我发现很难将文件作为发布请求发送【参考方案2】:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<?> upload(@RequestParam(value = "name") String 
name,@RequestParam(value = "file") MultipartFile file)
    // TODO check file is not null and save 
    return new ResponseEntity<>(HttpStatus.valueOf(200));;

【讨论】:

Same :( "message":"必需的字符串参数 'title' 不存在","status":400,"errors":["必需的字符串参数 'title' 不存在" ] 从下拉菜单中将“文件”的参数格式从文本更改为文件,然后选择您要上传的文件 更新第一个参数为这个@RequestParam(value = "name") String name 我已经改名了。看来我需要 Bean 定义。请看我的回答。它解决了我的问题。感谢您的帮助 或者你可以在applications.properties配置文件中添加spring.http.multipart.max-file-size=100Mb【参考方案3】:

将 Bean 添加到配置文件中。

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() 
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(-1);
    return multipartResolver;


【讨论】:

【参考方案4】:

虽然这不是原始发帖人的问题,但如果您发现此问题并且上述解决方案均不适合您,请检查您的 Postman 标题;如果设置了“Content-Type”标头,这可能会导致上述错误。

删除“Content-Type”标头可能会解决上述问题。

查看这个问题了解更多信息:

Postman : Required request part 'file' is not present

【讨论】:

【参考方案5】:

如果您仍然收到错误,请尝试从邮递员中删除所有标题并删除文件类型

【讨论】:

谢谢,解决了我用 webtestclient 测试的问题。我删除了 Content-Type 的标题。我认为webtestclient会添加它【参考方案6】:

在我的情况下,问题是我的 csv 没有按照其中设置的字符串命名

@PostMapping("/upload")
    public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) 

【讨论】:

【参考方案7】:

我怀疑主要原因是@RequestParam("file") 应该有 @RequestBody 代替。

【讨论】:

@RequestBody @RequestParam("name") String name 不起作用。当我尝试@RequestBody String name 名称变量时,得到以下值:------WebKitFormBoundary6WJHhVqqZrh8qeAX Content-Disposition: form-data; name="name" test ------WebKitFormBoundary6WJHhVqqZrh8qeAX-- 支持这个答案,因为它意识到我期望的文件名称(“文件”)与我在 Postman 上设置的名称不匹配。谢谢。【参考方案8】:

如果您的请求正文通过代理或任何其他可能不支持 multipart/form-data 甚至 octet-stream 内容类型的中介,请考虑您的请求正文可能无法到达您的服务器。希望这可以通过额外的配置来解决这种请求。我还可以建议您配置一个请求拦截器,以便您可以在控制器之前和之后记录您的请求,这可能有助于您了解请求参数、有效负载和标头。就我而言,我意识到我的请求正文的大小为 0,这有助于我检测导致此错误的原因不是我的 spring 配置。 Here 我留下了一个有用的资源来帮助您使用 Spring 开箱即用的日志拦截器。 enter link description here

【讨论】:

【参考方案9】:

在我的情况下,解决方案在配置中缺少“@EnableWebMvc”注释

@EnableWebMvc
@Configuration
internal class BulkOffersUploadConfig 

    @Bean
    fun multipartResolver(): MultipartResolver 
        val multipartResolver = CommonsMultipartResolver()
        multipartResolver.setMaxUploadSize(1000)
        multipartResolver.setMaxUploadSizePerFile(1000)
        return multipartResolver
    

【讨论】:

以上是关于春季文件上传 - '所需的请求部分不存在'的主要内容,如果未能解决你的问题,请参考以下文章

所需的请求部分“文件”不存在 - Angular 4

使用 multer 文件输入的 axios 请求中不存在所需的请求部分“文件”

在 tomcat 中运行的 Spring Boot,所需的请求部分“文件”不存在

上传到 App Store 时 iOS 缺少所需的图标文件

上传 DSYMS 文件失败。我已经上传了 myapp.app.dSYM 压缩文件,但它再次要求我上传“上传缺少所需的 dSYM”

文件上传http请求post改变