Android Spring文件上传OutofMemory

Android Spring文件上传OutofMemory,第1张

概述我正在尝试使用以下代码将文件上传到restapi.此代码适用于最大20MB左右的文件,但是较大的文件将出现OutOfMemoryError.我正在尝试对请求进行分块,并使用多部分形式的请求,这样我就不必将整个文件保留在内存中,但是块可能太大了?任何帮助是极大的赞赏.finalFilefile=newF

我正在尝试使用以下代码将文件上传到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);即可.实例化它之后.

总结

以上是内存溢出为你收集整理的Android Spring文件上传OutofMemory全部内容,希望文章能够帮你解决Android Spring文件上传OutofMemory所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1087700.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存