2017-04-06 5 views
0

그래서 저는 아래에 okhttp를 사용하는 개조 2로 작업하고 있습니다. 아래의 코드 조각은 작동하지만 큰 파일의 경우 OOM 오류가 발생합니다. 바이트 배열로 파일을 읽고 있기 때문에 이것이라고 생각합니다.개조 된 대형 Base64 인코딩 파일을 업로드하는 올바른 방법은 무엇입니까?

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

private void appendFileContentsToBody(Attachment attachment, MultipartBody.Builder requestBodyBuilder) throws IOException { 
    File file = new File(attachment.getAbsolutePath()); 
    if(file.exists()){ 
     RequestBody attachmentPart = RequestBody.create(null, Base64.getEncoder().encode(FileUtils.readFileToByteArray(file))); 
     requestBodyBuilder.addPart(Headers.of("X-Filename", attachment.getFilename()), attachmentPart); 
    } 
} 

답변

0

파일을 보내기 전에 Base64로 인코딩하면 안됩니다.이 파일은 Retrofit에서 스트림을 사용하여 작성해야합니다. 코드는 다음과 같아야합니다.

private void appendFileContentsToBody(Attachment attachment, MultipartBody.Builder requestBodyBuilder) throws IOException { 
    File file = new File(attachment.getAbsolutePath()); 
    if(file.exists()){ 
     RequestBody attachmentPart = RequestBody.create(MediaType.parse("application/pdf"), file); 
     requestBodyBuilder.addPart(Headers.of("X-Filename", attachment.getFilename()), attachmentPart); 
    } 
} 

여기서 "application/pdf"는 특정 파일의 MIME 유형입니다.
그런 식으로 당신은 OOM을 결코 겪지 않을 것입니다. 그러나이 접근법은 백엔드에서 구현 될 수 있습니다. 이제는 백엔드 구현이 요청 본문에서 인코딩 된 파일을 기대하는 웹 응용 프로그램에만 적용될 수 있습니다.