Spring 文件上传 - 'Required request part is not present'

Spring File Upload - 'Required request part is not present'

我正在尝试向我的控制器发送 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 发送请求,如下面的屏幕截图所示:

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

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

我也通过 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

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

@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));;
}

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

@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);
    }
}

虽然这不是发帖人的问题,但如果您发现这个问题并且上述 none 解决方案对您有效,请检查您的邮递员 headers;如果设置了"Content-Type" header,可能会出现上面的错误。

删除 "Content-Type" header 可能会解决上述问题。

查看此问题了解更多信息:

Postman : Required request part 'file' is not present

将 Bean 添加到配置文件。

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

}

还请考虑如果请求通过代理或任何其他可能不支持 multipart/form-data 甚至 octet-stream 内容类型的中介,您的请求 body 无法到达您的服务器的可能性。希望这可以通过额外的配置来解决这种请求。我还可以建议你配置一个请求拦截器,这样你就可以在你的控制器之前和之后记录你的请求,这可能有助于你了解请求参数、有效负载和 headers。在我的例子中,我意识到我的请求 body 的大小是 0,这有助于我检测导致此错误的原因不是我的 spring 配置。 Here I leave a useful resource to help you with the logging interceptor which Spring has out of the box. enter link description here

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

@EnableWebMvc
@Configuration
internal class BulkOffersUploadConfig {

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

如果仍然出现错误,请尝试从 postman 中删除所有 headers 并删除文件类型

在我的例子中,问题是我的 csv 没有按照

中设置的字符串命名
@PostMapping("/upload")
    public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) {

multipart/form-data JMeter POST 示例: HTTP Header 管理器: 接受 / Content-Type multipart/form-data;边界=------------------------jm888 期望 100-继续 User-Agent jmeter/3.3 HTTP 请求: 取消选中以下内容: 自动重定向 跟随重定向 用户保活 使用 multipart/form-data 作为 POST Browser-compatible headers Select Body 数据选项卡 Body 数据样本: ----------------------jm888 Content-Disposition: form-data;名称=“microsvc” Content-Type: application/json

{ “组织ID”:1, “ResourceId”:“0032ade8-cd59-45b6-8fff-299a63442474”, "StatusId": "00d8ff46-c688-47cb-85a2-8edfaa1db9a2", "TypeId": "a972697e-735e-11e7-8cf7-a6006ad3dba0", “编号”:“2a1773fe-dbb8-4510-b051-32b2ad823ea1” } ----------------------jm888 Content-Disposition: form-data;名称=“有效载荷”;文件名="1349.xml" Content-Type: application/xml

${__FileToString(C:\jmeterData\sourceData49.xml,)} ----------------------jm888--

真的不确定发生了什么,但我删除了代码

=======下面删除========

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

@Bean
public MultipartResolver multipartResolver() {

添加如下:

spring.servlet.multipart.max-file-size=-1 
spring.servlet.multipart.max-request-size=-1

而且,它开始神奇地工作了!也许我的 spring 版本就是这样。