我正在尝试使用以下代码将文件上传到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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)