[SPRING] Android Spring 파일 업로드 OutofMemory
SPRINGAndroid Spring 파일 업로드 OutofMemory
나머지 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 바이트 할당 메모리가 부족합니다.
해결법
-
==============================
1.코드를 분석하면 안드로이드 용 Spring이 데이터 보내기 전에 데이터를 버퍼링하는 것 같습니다. 이것이 OOE 이유입니다. 그러나 트릭이 있습니다 (하지만 지금까지는 API 레벨 9에서만 작동 가능했습니다) : 연결 팩토리에 대한 버퍼링을 비활성화 할 수 있지만 RestTemplate에 ClientHttpRequestInterceptor 목록 세트가없는 경우에만 (지금 얼마나 어리석은 지 ?) - 행운아 당신은 하나를 설정하지 않았다. 따라서 상황이 매우 간단하다면 factory.setBufferRequestBody (false)를 호출하면됩니다. 당신이 그것을 인스턴스화 한 후에.
코드를 분석하면 안드로이드 용 Spring이 데이터 보내기 전에 데이터를 버퍼링하는 것 같습니다. 이것이 OOE 이유입니다. 그러나 트릭이 있습니다 (하지만 지금까지는 API 레벨 9에서만 작동 가능했습니다) : 연결 팩토리에 대한 버퍼링을 비활성화 할 수 있지만 RestTemplate에 ClientHttpRequestInterceptor 목록 세트가없는 경우에만 (지금 얼마나 어리석은 지 ?) - 행운아 당신은 하나를 설정하지 않았다. 따라서 상황이 매우 간단하다면 factory.setBufferRequestBody (false)를 호출하면됩니다. 당신이 그것을 인스턴스화 한 후에.
from https://stackoverflow.com/questions/18095020/android-spring-file-upload-outofmemory by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] sitemesh 및 봄 MVC 데코레이터 패턴 문제 (0) | 2019.04.02 |
---|---|
[SPRING] Spring 부트에서 구성된 @Autowired 필터 사용 (0) | 2019.04.02 |
[SPRING] [org.thymeleaf.templateresolver.ServletContextTemplateResolver]를 인스턴스화하지 못했습니다 : 기본 생성자가 없습니다 (0) | 2019.04.02 |
[SPRING] Pem 인증서가있는 RestTemplate (0) | 2019.04.01 |
[SPRING] 최대 절전 모드를 사용하여 중첩 된 JSON 데이터를 MySQL 데이터베이스에 저장 (0) | 2019.04.01 |