Java Spring文件上传-';所需的请求部分不存在';

Java Spring文件上传-';所需的请求部分不存在';,java,spring,rest,postman,spring-restcontroller,Java,Spring,Rest,Postman,Spring Restcontroller,我试图向我的控制器发送POST请求,但除非我决定使用JSON,否则无法以任何类型传递任何参数。我的目标是将一个字符串和一个文件传递给我的控制器,但我不断得到所需的请求部分“xxx”不存在错误 @RestController public class ConfigurationController { @PostMapping(value = "/config") public ResponseEntity<?> saveEnvironmentConfig(@Reque

我试图向我的控制器发送POST请求,但除非我决定使用JSON,否则无法以任何类型传递任何参数。我的目标是将一个字符串和一个文件传递给我的控制器,但我不断得到
所需的请求部分“xxx”不存在
错误

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("file") MultipartFile uploadfile){
        return ResponseEntity.ok().body(null);
    }
}
注意:我已经检查过类似的帖子,但没有帮助

我怀疑主要原因是@RequestParam(“文件”) 应该有@RequestBody代替。

@RequestMapping(value=“/upload”,method=RequestMethod.POST)
@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));;
}
公共响应性上载(@RequestParam(value=“name”)字符串 名称,@RequestParam(value=“file”)多部分文件{ //TODO check文件不为空并保存 返回新的响应属性(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);
    }
}
@RestController
@请求映射(“/”)
公共类配置控制器{
@豆子
公共MultipartConfigElement MultipartConfigElement(){
返回新的MultipartConfigElement(“”);
}
@豆子
公共多部分解析器多部分解析器(){
org.springframework.web.multipart.commons.commons多部分解析器multipartResolver=新org.springframework.web.multipart.commons.commons多部分解析器();
multipartResolver.setMaxUploadSize(1000000);
返回多部件解析器;
}
@PostMapping(value=“/config”,consumes=“多部分/表单数据”)
公共响应属性saveEnvironmentConfig(@RequestParam(“密码”)字符串密码,@RequestParam(“文件”)多部分文件提交)
抛出AdminAuthenticationException、ConfigurationException{
返回ResponseEntity.ok().body(null);
}
}

虽然这不是原始海报的问题,但如果您发现这个问题,而上述解决方案都不适用于您,请检查您的邮递员标题;如果设置了“内容类型”标题,则可能会导致上述错误

删除“内容类型”标题,它可能会解决上述问题

有关更多信息,请参见此问题:


将Bean添加到配置文件中

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

}

如果您的请求主体正在通过代理或任何其他中介(可能不支持多部分/表单数据,甚至不支持八位字节流内容类型),请考虑请求主体无法到达服务器的可能性。希望通过额外配置来处理此类请求可以解决这一问题。我还建议您配置一个请求拦截器,这样您就可以在控制器前后记录您的请求,这可能有助于您了解请求参数、负载和头。在我的例子中,我意识到我的请求主体的大小是0,这有助于我检测导致此错误的不是我的spring配置。我留下一个有用的资源来帮助您使用Spring现成的日志拦截器

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

@EnableWebMvc
@Configuration
internal class BulkOffersUploadConfig {

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

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

在我的情况下,问题是mycsv未按照中设置的字符串命名

@PostMapping("/upload")
    public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) {
@PostMapping(“/upload”)
公共响应上载文件(@RequestParam(“文件”)多部分文件){


@RequestBody@RequestParam(“name”)字符串名
无效。当我尝试
@RequestBody String name
name变量时,获取以下值:
----webkitformboundary6wjhhvqzrh8qeax内容处置:表单数据;name=“name”测试----WebKitFormBoundary6WJHhVqqZrh8qeAX--
Upvoting此答案,因为它意识到我期望的文件名(“文件”)与我在Postman上设置的名称不匹配。谢谢。相同:({“消息”:“必需的字符串参数‘title’不存在”,“状态”:400,“错误”:[“必需的字符串参数‘title’不存在”]}从下拉菜单将“文件”的参数格式从文本更改为文件,并选择要上载的文件将第一个参数更新为此@RequestParam(value=“name”)字符串名称我已经更改了名称。似乎我需要Bean定义。请查看我的答案。它解决了我的问题。感谢您的帮助,或者您可以在applications.properties配置文件中添加spring.http.multipart.max file size=100Mb。这在spring 2.0.0中对我不起作用。事实上,添加这些Bean恰恰会创建该错误。Adding none不会导致错误。@Gokhan为什么使用multipartResolver()和multipartConfigElement()方法。添加@Bean public multipartConfigElement multipartConfigElement(){返回新的multipartConfigElement(“”;}并且可以在Spring Boot 2.1.6中工作,谢谢!请你能分享一下这个控制器的Junit测试用例。我发现作为post请求发送文件很困难。对于其他有类似问题的人,这可能是你正在寻找的解决方案:如果你使用Spring mvc,你必须在addConfig中添加bean multipartResolverwebtestclient测试时出现问题。我删除了内容类型的标题。我想webtestclient会添加它
@EnableWebMvc
@Configuration
internal class BulkOffersUploadConfig {

    @Bean
    fun multipartResolver(): MultipartResolver {
        val multipartResolver = CommonsMultipartResolver()
        multipartResolver.setMaxUploadSize(1000)
        multipartResolver.setMaxUploadSizePerFile(1000)
        return multipartResolver
    }
}
@PostMapping("/upload")
    public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) {