2017-04-06 1 views
0

Donc je travaille avec retrofit 2 qui utilise okhttp dessous. L'extrait de code ci-dessous fonctionne, mais j'obtiens des erreurs d'OOM pour les gros fichiers. Je crois que c'est parce que je lis le fichier à un tableau d'octets.Quelle est la bonne façon de télécharger de gros fichiers encodés Base64 avec retrofit?

Quelle est la méthode recommandée pour cela?

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); 
    } 
} 

Répondre

0

Vous ne devriez pas encoder un fichier dans base64 avant de l'envoyer, cela devrait être fait en utilisant flux, ce qui sera fait par Retrofit pour vous. Donc, votre code doit ressembler à

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); 
    } 
} 

où "application/pdf" est le type MIME du fichier particulier.
De cette façon, vous ne souffrirez jamais de l'OOM. Cependant cette approche pourrait être implémentée sur un backend d'abord parce que maintenant votre implémentation dorsale est devenue applicable aux applications web seulement parce qu'elle attend un fichier encodé dans un corps de requête.