ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android Spring文件上传OutofMemory

2019-10-30 16:19:37  阅读:169  来源: 互联网

标签:rest post out-of-memory spring android


我正在尝试使用以下代码将文件上传到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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有