2016-08-01 56 views
0

Kann nicht scheinen, dies herauszufinden, egal was ich versuche. Ich Absenden dieses curl Befehl:Spring Boot + Multipart/Form-Daten-Controller-Methode

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

Ich habe einen Frühling Boot-1.4-App mit einer kommentierten @RestController mit folgender Methode:

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

Die FILEDATA Variable immer null ist, und das Request-Objekt zeigt immer 0 Dateien an.

Ich habe mehrere Konfigurationen mit einem MultipartResolver versucht. Hier ist meine neueste:

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

ich auch von Hand stecken diese in meinem application.properties nur 1000% sicher zu sein, es ist nicht deaktiviert:

multipart.enabled=true 

spring.http.multipart.enabled = true

und für eine gute Maßnahme, hier sind die Request-Header:

* 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 
> 

Jeder Ahnung warum Ich kann die Datei auf meinem Controller nicht sehen.

UPDATE 1:

Wenn ich weit genug in das Request-Objekt zu graben und zu dem org.catalina.connector.Request Objekt bekommen, gibt es eine Arraylist von ApplicationPart Gegenständen, die eine DiskFileItem enthalten, die Informationen zu halten scheint über die Datei, die ich hochladen möchte. Dies ist die Sammlung, die zurückgegeben wird, wenn Sie request.getParts() aufrufen. Die Datei Punkt Standortpfad ist einige lange tmp Pfad:

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

aber es sagt auch der Inhaltstyp application/octet-stream ist, ist die Größe -1 und einige andere Seltsamkeit, wie „isFormField“ ist falsch, auch obwohl ich es als ein Formularfeld in meinem Curl-Befehl spezifiziere. Daher ruft spring die richtige Methode auf, um eine multipart/form-data-Anfrage zu bearbeiten, aber die "part" -Information scheint zu denken, dass es sich um einen Oktettstrom handelt.

+0

Ich glaube bescheiden, dass du dein Multipart-Objekt nicht instanziiert hast. Wie: MultipartFile filedata = fileToBeAdded.getSomething(); –

+0

Nicht sicher, was Sie meinen ... Ich erwarte die Datei in der Anfrage. Wenn ich etwas wie Map map = request.getFileMap(); mache, ist die Map leer. – Bal

+0

Versuchen Sie '@ RequestParam' anstelle von' @ RequestPart'. –

Antwort

-1

Ich teile meine Funktion zum Hochladen einer Datei mit MultipartFile es gibt keine Notwendigkeit für einen Resolver oder eine Bean, aber Sie können die Datei nur senden, nicht mit einem anderen Typ von Parameter oder Körper.

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

In diesem Fall lade ich ein Foto für einen Profilbenutzer hoch und wandle es in ein Array von Bytes um. Dann wird es in einer Datenbank gespeichert. hoffe, dass dir diese Hilfe hilft

+0

Danke Paulo - aber mein Problem ist die MultipartFile-Variable ist immer Null und ich kann nicht herausfinden, warum. – Bal