2016-08-01 1 views
0

Je n'arrive pas à comprendre cela, peu importe ce que j'essaie. Je soumets cette commande curl:Spring Boot + méthode de contrôleur multipart/form-data

curl -v -F name=countries.zip -F [email protected] http://localhost:8080/rest 

J'ai une application Boot Spring 1.4 avec un @RestController annoté avec la méthode suivante:

@RequestMapping(consumes = {"multipart/form-data"}, method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, path = {"/rest", "/rest/**"}) 
public void handleMultipartRestApiRequest(MultipartHttpServletRequest request, HttpServletResponse response, @RequestPart(value = "filedata", required = false) MultipartFile filedata) throws Exception { 
    r... 
} 

La variable filedata est toujours nulle, et l'objet de la demande montre toujours 0 fichiers.

J'ai essayé plusieurs configurations avec MultipartResolver. Voici mon dernier:

@Bean 
public MultipartResolver multipartResolver() { 
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
    multipartResolver.setMaxUploadSize(5000000); 
    multipartResolver.setMaxInMemorySize(5000000); 
    multipartResolver.setDefaultEncoding("utf-8"); 
    return multipartResolver; 
} 

J'ai aussi bloqué manuellement ces dans mes application.properties juste pour être 1000% sûr qu'il est pas désactivé:

multipart.enabled=true 

spring.http.multipart.enabled = true

et pour faire bonne mesure, voici les têtes de requête:

* Connected to localhost (::1) port 8080 (#0) 
> POST /rest HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.43.0 
> Accept: */* 
> Content-Length: 817999 
> Expect: 100-continue 
> Content-Type: multipart/form-data; boundary=------------------------7d3f4606455e862b 
> 

Quelqu'un at-il la moindre idée pourquoi Je n'arrive pas à voir le fichier sur mon contrôleur?

MISE À JOUR 1:

Si je creuse assez loin dans l'objet de la requête et à l'objet org.catalina.connector.Request, il y a une liste de tableaux d'éléments ApplicationPart qui contiennent un DiskFileItem qui semble détenir des informations sur le fichier que j'essaye de télécharger. C'est en fait la Collection qui est retournée lorsque vous appelez request.getParts(). Le chemin de l'emplacement de l'élément de fichier est une long chemin tmp:

/private/var/folders/n8/15d6vbhj0692cslf3cx8c1jm0000gn/T/tomcat.6840182548028446450.8080/work/Tomcat/localhost/myapp 

Cependant, il dit aussi le type de contenu est une application/octet-stream, la taille est -1, et d'autres bizarreries, comme « isFormField » est faux même si je le spécifie comme un champ de formulaire dans ma commande curl. Ainsi, spring appelle la méthode correcte pour gérer une requête multipart/form-data, mais les informations "part" semblent penser qu'il s'agit d'un flux d'octets.

+0

Je pense modestement que vous n'avez pas instancié votre objet multi-parties. Comme: MultipartFile filedata = fileToBeAdded.getSomething(); –

+0

Vous ne savez pas ce que vous voulez dire ... J'attends le fichier dans la requête. Si je fais quelque chose comme Map map = request.getFileMap() ;, la carte est vide. – Bal

+0

Essayez '@ RequestParam' à la place de' @ RequestPart'. –

Répondre

-1

Je vais partager ma fonction pour télécharger un fichier en utilisant MultipartFile il n'y a pas besoin d'un résolveur ou un bean, mais vous pouvez seulement envoyer le fichier seul, pas avec un autre type de param ou de corps.

@RequestMapping(value = "/updatePhoto", method = RequestMethod.POST) 
public @ResponseBody 
    ResponseEntity<?> updateUsuario(@RequestParam("file") MultipartFile file, 
     OAuth2Authentication authentication) { 
    try { 
     User user = (User) authentication.getPrincipal(); 
     Usuarios u = usuariosDAO.findUsuarioByUsername(user.getUsername()); 
     if (file.getName().isEmpty() == false) { 
      InputStream inputStream = file.getInputStream(); 
      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
      int nRead; 
      byte[] bytes = new byte[16384]; 
      while ((nRead = inputStream.read(bytes, 0, bytes.length)) != -1) { 
       buffer.write(bytes, 0, nRead); 
      } 
      buffer.flush(); 
      u.setImagen(buffer.toByteArray()); 
      usuariosDAO.updateUsuario(u); 
     } 
    } catch (Exception e) { 
     return new ResponseEntity<>(HttpStatus.BAD_REQUEST); 
    } 
    return new ResponseEntity<>(HttpStatus.OK); 
} 

Dans ce cas, je télécharge une photo pour un utilisateur de profil et la convertis en un tableau d'octets. Ensuite, il est enregistré sur une base de données. J'espère que cela vous aidera

+0

Merci Paulo - mais mon problème est que la variable MultipartFile est toujours nulle et je n'arrive pas à comprendre pourquoi. – Bal