首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件上传

文件上传
EN

Stack Overflow用户
提问于 2017-04-13 07:51:51
回答 2查看 252关注 0票数 2

我试图在Java中以块的形式上传一个文件。

我的块上传功能:

代码语言:javascript
复制
@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是这样的:

代码语言:javascript
复制
@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来看,一切都在正常工作。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-13 08:59:53

我的代码唯一的问题是,当我第一次调用File时,"sessionId“将是null

当我将Map条目的值设置为null时,整个条目不会被传递。我不知道。

我的修正是将一个defaultValue添加到@RequestParam("session") String sessionId中,以便方法声明看起来如下所示:

代码语言:javascript
复制
@RequestMapping(value = "/simpleUploader", method = RequestMethod.POST, produces = "application/json")
public ResponseEntity<UploadResponse> simpleUploader(
    ...
    @RequestParam(value = "session", defaultValue = "") String sessionId,
    ... ) throws IOException {
    ....
}
票数 0
EN

Stack Overflow用户

发布于 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 {

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43386511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档