Téléchargement de fichiers multiparts amorçage de printemps

J'utilise le démarrage de printemps et je veux utiliser un contrôleur pour recevoir un téléchargement de fichier multipart. Lors de l'envoi du fichier je continue à recevoir le erreur 415 Type de contenu non supporté réponse et le contrôleur n'est jamais atteint

There was an unexpected error (type=Unsupported Media Type, status=415).
Content type 'multipart/form-data;boundary=----WebKitFormBoundary1KvzQ1rt2V1BBbb8' not supported
<!-J'ai essayé l'envoi en utilisant form: action dans la page html/jsp et aussi dans une application client autonome qui utilise RestTemplate. Toutes les tentatives donnent le même résultat

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

Il semble d'après plusieurs parties la documentation que le paramètre boundary param doit être ajouté au téléchargement multipart cependant cela ne semble pas correspondre au contrôleur qui reçoit "multipart/form-data"

ma méthode de controller est setup comme suit

@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

Avec Des Fèves De Configuration

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

comme vous pouvez le voir, j'ai défini le type de consommables à "multipart/form-data" mais quand le multipart est envoyé il doit avoir un paramètre de limite et place une chaîne de limite aléatoire.

quelqu'un Peut s'il vous plaît dites - moi comment je peux définir le type de contenu dans le contrôleur de match ou modifier ma demande pour correspondre à mon contrôleur d'installation?

mes tentatives d'envoi ... Tentative 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>

tentative 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());
}

tentative 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());
18
demandé sur Rob McFeely 2014-09-06 15:24:15

6 réponses

@RequestBody MultipartFile[] submissions

doit être

@RequestParam("file") MultipartFile[] submissions

les fichiers ne sont pas le corps de la requête, ils en font partie et il n'y a pas de HttpMessageConverter qui peut convertir la demande à un tableau de MultiPartFile.

vous pouvez aussi remplacer HttpServletRequestMultipartHttpServletRequest, qui vous donne accès aux en-têtes de pièces individuelles.

14
répondu a better oliver 2014-09-06 12:33:17

vous pouvez simplement utiliser un controller méthode comme ceci:

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<?> uploadFile(
    @RequestParam("file") MultipartFile file) {

  try {
    // Handle the received file here
    // ...
  }
  catch (Exception e) {
    return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
  }

  return new ResponseEntity<>(HttpStatus.OK);
} // method uploadFile

sans aucune configuration supplémentaire pour le démarrage à ressort.

en utilisant les formulaire html côté client:

<html>
<body>
  <form action="/uploadFile" method="POST" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="Upload"> 
  </form>
</body>
</html>

Si vous souhaitez définir limites de taille des fichiers vous pouvez le faire dans le application.properties:

# File size limit
multipart.maxFileSize = 3Mb

# Total request size for a multipart/form-data
multipart.maxRequestSize = 20Mb

de plus envoyer le fichier avec Ajax prendre un coup d'oeil ici: http://blog.netgloo.com/2015/02/08/spring-boot-file-upload-with-ajax/

19
répondu Andrea 2015-02-09 14:20:45

La dernière version de SpringBoot fait téléchargement de plusieurs fichiers très facile également. Du côté du navigateur, vous avez juste besoin du formulaire de téléchargement HTML standard, mais avec plusieurs éléments d'entrée (un fichier à télécharger, ce qui est très important), tous ayant le même nom d'élément (name="files" pour l'exemple ci-dessous)

puis dans votre classe Spring @Controller sur le serveur tout ce dont vous avez besoin c'est quelque chose comme ceci:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
    public @ResponseBody ResponseEntity<?> upload(
        @RequestParam("files") MultipartFile[] uploadFiles) throws Exception     
{
    ...now loop over all uploadFiles in the array and do what you want
  return new ResponseEntity<>(HttpStatus.OK);
}

ce sont les parties difficiles. C'est-à-dire, savoir créer plusieurs éléments d'entrée nommés "files" et savoir utiliser un MultipartFile[] (array) comme paramètre de requête sont les choses délicates à savoir, mais c'est aussi simple que cela. Je n'entrerai pas dans la façon de traiter une entrée MultipartFile, parce qu'il y a beaucoup de docs dessus déjà.

5
répondu 2015-08-29 19:56:09
   @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize("5120MB");
        factory.setMaxRequestSize("5120MB");
        return factory.createMultipartConfig();
    }

mettre dans la classe où vous définissez les haricots

3
répondu Ashutosh Jha 2015-04-14 11:18:13
@RequestMapping(value="/add/image", method=RequestMethod.POST)
public ResponseEntity upload(@RequestParam("id") Long id, HttpServletResponse response, HttpServletRequest request)
{   
    try {
        MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest)request;
        Iterator<String> it=multipartRequest.getFileNames();
        MultipartFile multipart=multipartRequest.getFile(it.next());
        String fileName=id+".png";
        String imageName = fileName;

        byte[] bytes=multipart.getBytes();
        BufferedOutputStream stream= new BufferedOutputStream(new FileOutputStream("src/main/resources/static/image/book/"+fileName));;

        stream.write(bytes);
        stream.close();
        return new ResponseEntity("upload success", HttpStatus.OK);

    } catch (Exception e) {
        e.printStackTrace();
        return new ResponseEntity("Upload fialed", HttpStatus.BAD_REQUEST);
    }   
}
1
répondu Vikki Kamboj 2017-05-24 00:53:43

dans Controller, votre méthode devrait être;

@RequestMapping(value = "/upload", method = RequestMethod.POST)
    public ResponseEntity<SaveResponse> uploadAttachment(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
....

en Outre, vous devez mettre à jour l'application.yml (ou application.propriétés) pour prendre en charge la taille maximale du fichier et la taille de la requête.

spring:
    http:
        multipart:
            max-file-size: 5MB
            max-request-size: 20MB
1
répondu THIMIRA 2017-06-27 16:01:12