Файл всегда равен нулю в srpingboot 1.3.7 при обработке запроса multipart / form-data - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь связать приложение 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

Я использую библиотеки commons-io и commons-fileupload Apache. Я установил многочастный преобразователь следующим образом:

@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]

Я пытался использовать почтальон, и я получаю то же сообщение об ошибке. Я не могу понять, что мне здесь не хватает, любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

В Spring-Boot REST для многокомпонентных 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) {

Spring Multipart config в yaml

spring:
 servlet:
  multipart:
   max-file-size: 5MB
   max-request-size: 5MB

И как это назвать от PostMan- enter image description here

0 голосов
/ 02 мая 2020

При работе с Multipart у меня сработало следующее при загрузке Spring.

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

Надеюсь, оно может оказать некоторую помощь в вашей реализации.

...