当前位置: 首页 > 知识库问答 >
问题:

处理multipart/form-data请求时,srpingboot 1.3.7中的文件始终为空

阴飞星
2023-03-14

我正在尝试将grails应用程序与springboot应用程序进行通信。我正在尝试将一个文件上载到springboot应用程序,该文件之前已上载到grails。这是我的springboot控制器的代码:

@ResponseBody
    @PostMapping(value = "/save", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    def save(@Valid @ModelAttribute SaveRequest request) {
        //Some logic
}

saveRequest类包含一些需要应用于请求的验证

class SaveHotelAccreditationRequest {

    //Other fields

    @NotNull
    MultipartFile image

}

我已经在应用程序中设置了属性。像这样的属性文件

spring.http.multipart.enabled = true
spring.http.multipart.location=/home/user/temp

我使用Apache的commons io和commons fileupload库。我已经这样设置了多部分解析器

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(2*1024*1024);
    return multipartResolver;
}

这是我的grails应用程序中的代码

CredentialsProvider credsProvider = new BasicCredentialsProvider()
    credsProvider.setCredentials(
            AuthScope.ANY,
            new UsernamePasswordCredentials(userName, password))
    CloseableHttpClient httpclient = HttpClients.custom()
            .setDefaultCredentialsProvider(credsProvider)
            .build()
    try {
        HttpPost httpPost = new HttpPost(url)
        MultipartEntityBuilder reqEntity = MultipartEntityBuilder.create()
        reqEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
        reqEntity.addBinaryBody('image', file, ContentType.MULTIPART_FORM_DATA, file.getName())
        //Other fields
        httpPost.setEntity(reqEntity.build())
        System.out.println("Executing request " + httpPost.getRequestLine())
        CloseableHttpResponse response = httpclient.execute(httpPost)
        try {
            System.out.println("----------------------------------------")
            System.out.println(response.getStatusLine())
            System.out.println(EntityUtils.toString(response.getEntity()))
        } finally {
            response.close()
        }
    } finally {
        httpclient.close()
    }

当我运行请求时,会收到以下错误消息:

2020-05-02 02:37:24 | WARN | org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolved
 exception caused by Handler execution: org.springframework.validation.BindException: org.springframework.validatio
n.BeanPropertyBindingResult: 1 errors
Field error in object 'saveHotelAccreditationRequest' on field 'image': rejected value [null]; codes [NotNull.saveRequest.image,NotNull.image,NotNull.org.springframework.web.multipart.MultipartFile,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [saveRequest.image,image]; arguments []; default message [image]]; default message [may not be null]

我尝试过使用postman,但收到了相同的错误消息。我不知道我在这里遗漏了什么,任何帮助都将不胜感激。

共有2个答案

龚寂弦
2023-03-14

在使用Multipart时,以下内容在Spring Boot中为我工作。

@PostMapping(value = "/uploadVideo")
public void uploadVideo(HttpServletRequest request, HttpServletResponse response,
            @RequestParam("file") MultipartFile file) throws Exception {
    // logic here
}

并且您用于最大大小的多部分解析器可以在这样的属性文件中配置

# Max file size.
spring.servlet.multipart.max-file-size=200MB
# Max Request Size
spring.servlet.multipart.max-request-size=215MB

这是我从Angular应用程序调用的

var reqHeader=new HttpHeaders();
    reqHeader.append('contentType','multipart/form-data')
    let options = { headers: reqHeader, params: new HttpParams()
                          
                   };
    const formData = new FormData();
    formData.append('file', file )
    return this.http.post(this.url_toreadFile,formData,options)

希望它能为您的实现提供一些帮助。

姬念
2023-03-14

在Spring Boot REST for multipart API中,我编写的多部分API如下

@PostMapping("/upload-doc")
@ApiImplicitParam(paramType = "body", name = "payload", dataType = "UploadDocRequest")
@ResponseStatus(HttpStatus.CREATED)
@ApiOperation("Upload User's documents")
public UploadDocRequest uploadDocRequest(
        @RequestPart("payload") UploadDocRequest payload, @RequestPart("docs") MultipartFile[] docs) {

yaml中的Spring Multipart配置

spring:
 servlet:
  multipart:
   max-file-size: 5MB
   max-request-size: 5MB
 类似资料:
  • 但如果我将请求更改为“multipart/form-data”-春回错误400“bad request”: 为什么?也许我应该创造一些额外的豆子? PS:我需要“multipart/form-data”来与json对象一起发送文件。

  • 我需要你的帮助。我正在使用Spring3实现一个RESTful WebService的服务器部分。不幸的是,我对如何发送请求没有任何影响,所以没有办法改变这一点。 我想接收一个作为多部分/表单数据的http post请求。我有一个@RestController并做了一个@RequestMapping..请求到达我的方法 我希望可以使用方法检索所有部分。这是不可能的,总是没有可用的零件。我想我找到了

  • 我必须使用REST API将文件和信息上传到服务器。该API使用多部分形式,但我似乎无法正确使用它。 null 我尝试了几种方法,比如下面的代码,但是我不断从服务器得到错误的请求。

  • 使用resteasy处理多部分/表单数据请求时,如何控制最大文件大小和/或最大请求大小? 我的代码如下所示: 通过Servlet,我可以使用MultipartConfig注释控制内容。 所以我在考虑绕过resteish并使用注入并在web.xml中配置我的servlet,但我不确定副作用。

  • 如何在Python中用请求发送?如何发送文件,我明白了,但是如何用这种方法发送表单数据就不明白了。

  • 任务是将请求发布到某些TTS(文本到语音)endpoint,并从响应中获取音频。endpoint位于专用网络中,因此我无法与您共享以直接测试,但我的问题不是特定于域的,我认为这是一个一般的http问题。 现有的工作curl和python2脚本如下: 请求。txt: python2脚本主要构造请求内容,然后调用http lib。请求('POST',uri,一些BytesIO(),标头)。 现在我想使