我试图在Java中以块的形式上传一个文件。
我的块上传功能:
@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) at 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函数之前,它也会从Spring中被拒绝。
我已经以同样的方式上传了,但在Javascript中。从Javascript来看,一切都在正常工作。
我遗漏了什么?
发布于 2017-04-13 08:59:53
我的代码唯一的问题是,当我第一次调用File时,"sessionId“将是null。
当我将Map条目的值设置为null时,整个条目不会被传递。我不知道。
我的修正是将一个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 {
....
}发布于 2017-04-13 09:33:36
@异步有两个限制。
http://www.baeldung.com/spring-async
尝试将private更改为public
@Async public Future<String> sendChunk(byte[] chunk, int start, int end, int numberOfChunks, String name, String sessionId) throws IOException {
https://stackoverflow.com/questions/43386511
复制相似问题