繁体   English   中英

Spring 文件上传 - “所需的请求部分不存在”

[英]Spring File Upload - 'Required request part is not present'

我正在尝试向我的 controller 发送 POST 请求,但除非我决定使用 JSON,否则无法传递任何类型的任何参数。 我的目标是将字符串和文件传递给我的 controller 但我不断收到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 发送请求,如下面的截图所示:

邮递员请求

邮递员请求 2

唯一的 header 标签用于授权。 我没有任何 Content-Type header,我尝试添加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

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

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

在此处输入图像描述

将 Bean 添加到配置文件。

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

}

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

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

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

Postman:所需的请求部分“文件”不存在

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

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

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

在此处输入图像描述

在此处输入图像描述

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

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

真的不知道发生了什么,但我删除了代码

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

@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 版本的情况

在我的情况下,输入类型文件的name 属性未设置为"file"

<input type="file" class="file-input" id="fileUpload" name="file">

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

@EnableWebMvc
@Configuration
internal class BulkOffersUploadConfig {

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

多部分/表单数据 JMeter POST 示例:HTTP Header 管理器:接受/内容类型多部分/表单数据; 边界=------------jm888 期望 100 次继续用户代理 jmeter/3.3 HTTP 请求:取消选中以下:重定向自动跟随重定向用户 KeepAlive将 multipart/form-data 用于 POST 浏览器兼容的标头 Select 主体数据的主体数据选项卡示例:------------jm888 内容处置:表格数据; name="microsvc" 内容类型:应用程序/json

{ “orgId”:1,“ResourceId”:“0032ade8-cd59-45b6-8fff-299a63442474”,“StatusId”:“00d8ff46-c688-47cb-85a2-8edfaa1db9a2”,“TypeId”:“a972697e-735e-11e7- 8cf7-a6006ad3dba0", "Id": "2a1773fe-dbb8-4510-b051-32b2ad823ea1" } ------------------------jm888 内容处置:表格数据; 名称="有效载荷"; 文件名="1349.xml" 内容类型:应用程序/xml

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM