Multipart Datei hochladen Spring Boot

Im verwendet Spring Boot und möchte einen Controller zum Empfangen eines mehrteiligen Datei-Uploads verwenden. Beim Senden der Datei erhalte ich immer daserror 415 nicht unterstützter Inhaltstyp Antwort und der Controller wird nie erreicht

There was an unexpected error (type=Unsupported Media Type, status=415).
Content type 'multipart/form-data;boundary=----WebKitFormBoundary1KvzQ1rt2V1BBbb8' not supported

Ich habe versucht, mithilfe von form: action in einer HTML / JSP-Seite und auch in einer eigenständigen Clientanwendung, die RestTemplate verwendet, zu senden. Alle Versuche führen zu demselben Ergebnis

multipart/form-data;boundary=XXXXX not supported.

Aus der mehrteiligen Dokumentation geht hervor, dass der Randparameter zum mehrteiligen Upload hinzugefügt werden muss. Dies scheint jedoch nicht mit dem Controller übereinzustimmen, der @ empfäng"multipart/form-data"

Meine Controller-Methode wird wie folgt eingerichtet

@RequestMapping(value = "/things", method = RequestMethod.POST, consumes = "multipart/form-data" ,
                                     produces = { "application/json", "application/xml" })
     public ResponseEntity<ThingRepresentation> submitThing(HttpServletRequest request,
                                     @PathVariable("domain") String domainParam,
                                     @RequestParam(value = "type") String thingTypeParam,
                                     @RequestBody MultipartFile[] submissions) throws Exception

Mit Bean Setup

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

Wie Sie sehen können, habe ich den Consumes-Typ auf "multipart / form-data" gesetzt, aber wenn das Multipart gesendet wird, muss es einen Randparameter haben und eine zufällige Randzeichenfolge setzen.

Kann mir jemand sagen, wie ich den Inhaltstyp im Controller entweder so einstellen oder meine Anfrage so ändern kann, dass sie mit meinem Controller-Setup übereinstimmt?

Meine Versuche zu senden ... Versuch 1 ...

<html lang="en">
<body>

    <br>
    <h2>Upload New File to this Bucket</h2>
    <form action="http://localhost:8280/appname/domains/abc/things?type=abcdef00-1111-4b38-8026-315b13dc8706" method="post" enctype="multipart/form-data">
        <table width="60%" border="1" cellspacing="0">
            <tr>
                <td width="35%"><strong>File to upload</strong></td>
                <td width="65%"><input type="file" name="file" /></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><input type="submit" name="submit" value="Add" /></td>
            </tr>
        </table>
    </form>
</body>
</html>

Versuch 2 ....

RestTemplate template = new RestTemplate();
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
parts.add("file", new FileSystemResource(pathToFile));

try{

    URI response = template.postForLocation(url, parts);
}catch(HttpClientErrorException e){
    System.out.println(e.getResponseBodyAsString());
}

Versuch 3 ...

FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
        formHttpMessageConverter.setCharset(Charset.forName("UTF8"));


        RestTemplate restTemplate = new RestTemplate();

        restTemplate.getMessageConverters().add( formHttpMessageConverter );
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

        MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
        map.add("file", new FileSystemResource(path));

        HttpHeaders imageHeaders = new HttpHeaders();
        imageHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

        HttpEntity<MultiValueMap<String, Object>> imageEntity = new HttpEntity<MultiValueMap<String, Object>>(map, imageHeaders);
        ResponseEntity e=  restTemplate.exchange(uri, HttpMethod.POST, imageEntity, Boolean.class);
        System.out.println(e.toString());

Antworten auf die Frage(6)

Ihre Antwort auf die Frage