2017-04-13 64 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 {