J'essaie de faire un HTTP POST sur le serveur en utilisant Retrofit 2.0
MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG,90,byteArrayOutputStream);
profilePictureByte = byteArrayOutputStream.toByteArray();
Call<APIResults> call = ServiceAPI.updateProfile(
RequestBody.create(MEDIA_TYPE_TEXT, emailString),
RequestBody.create(MEDIA_TYPE_IMAGE, profilePictureByte));
call.enqueue();
Le serveur renvoie une erreur indiquant que le fichier n'est pas valide.
C'est bizarre parce que j'ai essayé de télécharger le même fichier avec le même format sur iOS (en utilisant une autre bibliothèque), mais il est téléchargé avec succès.
Je me demande quelle est la bonne façon de télécharger une image à l'aide de Retrofit 2.0 ?
Dois-je l'enregistrer sur le disque avant de le télécharger?
PS: J'ai utilisé la modernisation pour d'autres demandes Multipart qui n'incluent pas d'image et elles se sont terminées avec succès. Le problème, c'est lorsque j'essaie d'inclure un octet dans le corps.
android
retrofit
androidhttpclient
retrofit2
JayVDiyk
la source
la source
Réponses:
Je mets en évidence la solution dans les versions 1.9 et 2.0 car elle est utile pour certains
En
1.9
, je pense que la meilleure solution consiste à enregistrer le fichier sur le disque et à l'utiliser comme fichier typé comme:RetroFit 1.9
(Je ne connais pas votre implémentation côté serveur) ont une méthode d'interface API similaire à celle-ci
Et utilisez-le comme
Pour RetroFit 2 Utilisez la méthode suivante
RetroFit 2.0 (C'était une solution de contournement pour un problème dans RetroFit 2 qui est maintenant corrigé, pour la méthode correcte, reportez- vous à la réponse de jimmy0251 )
Interface API:
Utilisez-le comme:
la source
@Multipart @POST("/api/Accounts/editaccount") Call<User> editUser(@PartMap Map<String, RequestBody> params);
And When you have the file:Map<String, RequestBody> map = new HashMap<>(); RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpg"), file); map.put("file\"; filename=\"" + file.getName(), fileBody);
MultiPartBody.Part
Il existe une manière correcte de télécharger un fichier avec son nom avec Retrofit 2 , sans aucun hack :
Définissez l'interface API:
Téléchargez un fichier comme celui-ci:
Cela ne montre que le téléchargement de fichiers, vous pouvez également ajouter d'autres paramètres dans la même méthode avec
@Part
annotation.la source
MultipartBody.Part
arguments dans la même API.@Part("images[]") List<MultipartBody.Part> images
mais cela donne une erreur@Part parameters using the MultipartBody.Part must not include a part name
@Body MultipartBody multipartBody
etMultipartBody.Builder
pour envoyer une collection d'images.J'ai utilisé Retrofit 2.0 pour mes utilisateurs de registre, envoyer une image de fichier en plusieurs parties / formulaire et du texte à partir du compte de registre
Dans mon RegisterActivity, utilisez une AsyncTask
Et dans ma classe Register.java, c'est où utiliser Retrofit avec appel synchrone
Dans l'interface de RegisterService
Pour l'analyse des utilitaires de la réponse InputStream
la source
Code de mise à jour pour le téléchargement du fichier image dans Retrofit2.0
Changer
MediaType.parse("image/*")
pourMediaType.parse("image/jpeg")
la source
@Multipart
alors l'@Part
annotation doit fournir un nom ou utiliser le type de paramètre MultipartBody.Part.@Part("profile_pic\"; filename=\"pp.png "
Ajout à la réponse donnée par @insomniac . Vous pouvez créer un
Map
pour mettre le paramètre pourRequestBody
inclure l'image.Code pour l'interface
Code pour la classe Java
la source
C'est donc une manière très simple d'accomplir votre tâche. Vous devez suivre l'étape ci-dessous: -
1. Première étape
Vous devez passer l'appel entier en tant que
@Multipart request
.item
etimage number
est juste un corps de chaîne qui est enveloppéRequestBody
. Nous utilisons leMultipartBody.Part class
qui nous permet d'envoyer le nom de fichier réel en plus des données du fichier binaire avec la demande2. Deuxième étape
Maintenant vous avez
image path
et vous devez convertir enfile
.Maintenant convertirfile
enRequestBody
méthode usingRequestBody.create(MediaType.parse("multipart/form-data"), file)
. Vous devez maintenant convertir votre méthodeRequestBody requestFile
enMultipartBody.Part
utilisantMultipartBody.Part.createFormData("Image", file.getName(), requestBody);
.ImageNumber
etItemId
sont mes autres données que je dois envoyer au serveur afin que je fasse également les deux chosesRequestBody
.Pour plus d'informations
la source
Le téléchargement de fichiers à l'aide de la mise à niveau est assez simple Vous devez créer votre interface API comme
dans l' image de code ci-dessus est le nom de la clé donc si vous utilisez php, vous écrirez $ _FILES ['image'] ['tmp_name'] pour l'obtenir. Et filename = "monfichier.jpg" est le nom de votre fichier qui est envoyé avec la demande.
Maintenant, pour télécharger le fichier, vous avez besoin d'une méthode qui vous donnera le chemin absolu de l'URI.
Vous pouvez maintenant utiliser le code ci-dessous pour télécharger votre fichier.
Pour des explications plus détaillées, vous pouvez visiter ce didacticiel de téléchargement de fichiers de mise à niveau .
la source
Version Kotlin avec mise à jour pour dépréciation de
RequestBody.create
:Interface de modernisation
et pour télécharger
Merci à @ jimmy0251
la source
N'utilisez pas plusieurs paramètres dans le nom de la fonction, utilisez simplement une simple convention d'arguments qui augmentera la lisibilité des codes , pour cela, vous pouvez faire comme -
Il peut y avoir plusieurs exceptions que vous pouvez rencontrer lors de l'utilisation de Retrofit, toutes les exceptions documentées sous forme de code , ont une procédure pas à pas pour
retrofit2/RequestFactory.java
. vous pouvez utiliser deux fonctionsparseParameterAnnotation
etparseMethodAnnotation
où vous pouvez faire une exception lancée, veuillez passer par ceci, cela vous fera gagner beaucoup de temps que googler / stackoverflowla source
dans kotlin c'est assez simple, en utilisant les méthodes d'extensions de toMediaType , asRequestBody et toRequestBody, voici un exemple:
ici, je poste quelques champs normaux avec un fichier pdf et un fichier image en utilisant multipart
il s'agit d'une déclaration d'API utilisant la modernisation:
et voici comment l'appeler:
la source