2016-08-01 46 views
0

似乎無法弄清楚這一點,不管我嘗試什麼。我提交本curl命令:Spring Boot +多部件/表格數據控制器方法

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

我有一個春天啓動1.4應用程序用下面的方法的註釋@RestController:

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

的FILEDATA變量始終是空的,請求對象總是顯示0個文件。

我試過MultipartResolver的多個配置。這裏是我的最新消息:

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

我還堅持手工這些在我的application.properties公正,以確保它沒有禁用1000%:

multipart.enabled=true 

spring.http.multipart.enabled =真

和良好的措施,這裏的請求頭:

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

任何人有一個線索,爲什麼我似乎無法看到我的控制器上的文件?

更新1:

如果我挖得足夠深,請求對象,並獲得了org.catalina.connector.Request對象,還有的含有似乎保存有關信息的DiskFileItem ApplicationPart項目的ArrayList我正在嘗試上傳的文件。這實際上是調用request.getParts()時返回的Collection。該文件的項目位置路徑是一些長期TMP的路徑:

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

但是它也說,內容類型是應用程序/八位字節流,大小爲-1,和其他一些怪事,比如「isFormField」是假的,甚至儘管我在curl命令中將它指定爲表單域。所以Spring正在調用處理多部分/表單數據請求的正確方法,但「部分」信息似乎認爲它是一個八位字節流。

+0

我謙虛地認爲你沒有實例化你的多部分對象。像:MultipartFile filedata = fileToBeAdded.getSomething(); –

+0

不確定你的意思...我期待在請求中的文件。如果我做了類似Map map = request.getFileMap()的東西,地圖是空的。 – Bal

+0

嘗試使用'@ RequestParam'而不是'@ RequestPart'。 –

回答

-1

我會分享我的功能,使用MultipartFile上傳文件,不需要解析器或bean,但只能發送文件,而不能使用其他類型的參數或主體。

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

在這種情況下,我上傳了一個配置文件用戶的照片,並將其轉換爲一個字節數組。然後將其保存在數據庫中。希望這有助於你

+0

感謝Paulo - 但我的問題是MultipartFile變量始終爲空,我似乎無法弄清楚原因。 – Bal

相關問題