Android Spring文件上传OutofMemory
作者:互联网
我正在尝试使用以下代码将文件上传到rest api.此代码适用于最大20MB左右的文件,但是较大的文件将出现OutOfMemoryError.我正在尝试对请求进行分块,并使用多部分形式的请求,这样我就不必将整个文件保留在内存中,但是块可能太大了?任何帮助是极大的赞赏.
final File file = new File(filePath);
HttpHeaders header = new HttpHeaders();
header.add("x-haiku-auth", HaikuAPI.getAuthHeader());
header.setContentType(MediaType.MULTIPART_FORM_DATA);
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(
"https://" + HaikuAPI.getDomain() + "/api/assignments")
.pathSegment(assignmentID + "", "submit");
URI url = builder.build().toUri();
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
parts.add("message[subject]", "Assignment Completed");
parts.add("message[body]", message);
parts.add("message[assignment_id]", assignmentID + "");
Uri uri = Uri.fromFile(file);
InputStreamResource res = new InputStreamResource(context.getContentResolver().openInputStream(uri)) {
@Override
public String getFilename() throws IllegalStateException {
return file.getName();
}
@Override
public long contentLength() throws IOException {
return file.length();
}
};
parts.add("files[][file]", res);
parts.add("files[][filename]", file.getName());
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setChunkSize(1024);
RestTemplate restTemplate = new RestTemplate(factory);
restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
HttpEntity<Object> request = new HttpEntity<Object>(parts, header);
restTemplate.postForLocation(url, request);
Log.e("f", "finished");
return null;
错误:
dalvikvm-heap:67102090字节分配上的内存不足.
解决方法:
通过分析代码,Spring for Android似乎在发送数据之前先缓冲其数据-这就是您的OOE的原因.但是,有一个技巧(但是到目前为止,我已经使它只能用于上面的API级别9):您可以禁用其连接工厂的缓冲,但是只有在RestTemplate没有设置ClientHttpRequestInterceptor列表的情况下(现在是多么愚蠢) ?)-幸运的是您没有设置一个.因此,在您的情况下,情况非常简单,只需调用factory.setBufferRequestBody(false);即可.实例化它之后.
标签:rest,post,out-of-memory,spring,android 来源: https://codeday.me/bug/20191030/1968901.html