2017-04-13 62 views
2

我正嘗試用Java以塊的形式上傳文件。
我塊上傳功能:文件上傳Java Spring

@Async 
private Future<String> sendChunk(byte[] chunk, int start, int end, int numberOfChunks, String name, String sessionId) throws IOException { 

    LinkedMultiValueMap<String, Object> requestParams = new LinkedMultiValueMap<>(); 
    requestParams.add("data", new String(java.util.Base64.getEncoder().encode(chunk), "UTF-8")); 
    requestParams.add("start", start); 
    requestParams.add("end", end); 
    requestParams.add("numberOfChunks", numberOfChunks); 
    requestParams.add("fileName", name); 
    requestParams.add("session", sessionId); 

    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(requestParams); 
    UploadResponse uploadResponse = restTemplate.exchange(fileServiceUrl, HttpMethod.POST, requestEntity, new ParameterizedTypeReference<UploadResponse>(){}).getBody(); 
    return new AsyncResult<>(uploadResponse.getSessionId()); 
} 

這是文件的服務的API的樣子:

@RequestMapping(value = "/simpleUploader", method = RequestMethod.POST, produces = "application/json") 
public ResponseEntity<UploadResponse> simpleUploader(
    @RequestParam("data") String data, 
    @RequestParam("session") String sessionId, 
    @RequestParam("start") int start, 
    @RequestParam("end") int end, 
    @RequestParam("numberOfChunks") int numberOfChunks, 
    @RequestParam("fileName") String fileName) throws IOException { 
    .... 
} 

現在,如果我嘗試上傳一個塊中的文件的服務與400 - Bad Request響應。
棧跟蹤:

org.springframework.web.client.HttpClientErrorException:400空 在org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) 在org.springframework。 web.client.RestTemplate.handleResponse(RestTemplate.java:667) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:620) at org.springframework.web.client.RestTemplate.execute(RestTemplate。 java:580) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:526)

甚至在它進入API函數之前它將被拒絕。
我已經以同樣的方式上傳,但在Javascript中。從Javascript一切工作,因爲它應該。
我錯過了什麼?

+1

再檢查一下HTTP:// stackoverflow.com/questions/6074516/how-could-i-upload-a-large-file-in-chunks-using-java/29523375#29523375可能會有所幫助。 –

+0

究竟是什麼? –

+0

使用pl上傳的另一種上傳方式。 –

回答

0

我的代碼唯一的問題是,我第一次調用File-Service API時,「sessionId」將是null
當我將Map Entry的值設置爲null時,整個Entry不會被傳遞。我不知道。
我定盤添加到defaultValue這樣@RequestParam("session") String sessionId的方法聲明看起來像這樣:

@RequestMapping(value = "/simpleUploader", method = RequestMethod.POST, produces = "application/json") 
public ResponseEntity<UploadResponse> simpleUploader(
    ... 
    @RequestParam(value = "session", defaultValue = "") String sessionId, 
    ...) throws IOException { 
    .... 
} 
+0

那麼,如果它的工作,它的作品。但我寧願有一個機制來確保在任何邏輯被調用之前會話存在,而這依賴於會話。 – Gimby

+0

最初沒有可用的會話。第一塊是客戶端和服務器之間的「握手」。當第一個塊被上傳時,服務器將爲其餘的文件塊創建一個會話。 –

0

的@Async有兩個限制。

  • 它只能用於公共方法。
  • 自我調用 - 來自同一個類中調用異步方法 - 將無法正常工作

http://www.baeldung.com/spring-async

嘗試改變privatepublic

@Async public Future<String> sendChunk(byte[] chunk, int start, int end, int numberOfChunks, String name, String sessionId) throws IOException {