2016-12-02 3 views
3

Ici, j'utilise @Fields données avec @FormUrlEncoded Mais je dois utiliser les deux dans la même API @Part("user_image") RequestBody file avec @Multipart. Comment est-ce possible? Merci d'avance.comment envoyer un fichier image avec Retrofit (@Fields)

@FormUrlEncoded 
@POST("/datingapp/index.php/Webservice") 
Call<Result> signupUser(@Field("user_name") String name, 
          @Field("age") String age, 
          @Field("work") String work, 
          @Field("home_town") String home_town, 
          @Field("gender") String gender, 
          @Field("interest") String interest, 
          @Field("study") String study, 
          @Field("email") String email, 
          @Field("password") String password, 
          @Field("device_id") String device_id, 
          @Field("device_type") String device_type, 
          @Part("user_image") RequestBody file, 
          @Field("signup") String signup); 
+0

Vous pouvez envoyer une image sous la forme de chaîne base64. Je n'ai jamais utilisé Retrofit, mais jetez un oeil [ICI] (http://stackoverflow.com/questions/22787585/android-retrofit-base64body) et [ICI] (http://stackoverflow.com/questions/32009612/retrofit -send-base64-encoded-string-in-parameters) –

Répondre

2

Le protocole Http n'autorise pas 2 Content-Type dans la même requête. Donc, vous devez choisir:

  • application/x-www-form-urlencoded
  • multipart/form-data

Vous utilisez application/x-www-form-urlencoded en utilisant l'annotation @FormUrlEncoded afin d'envoyer l'image que vous avez à transforme le fichier entier en texte (par exemple base64).

Une meilleure approche serait l'utilisation multipart/form-data en décrivant votre demande comme ça:

@Multipart 
@POST("/datingapp/index.php/Webservice") 
Call<Result> signupUser(@Part("user_name") String name, 
         @Part("age") String age, 
         @Part("work") String work, 
         @Part("home_town") String home_town, 
         @Part("gender") String gender, 
         @Part("interest") String interest, 
         @Part("study") String study, 
         @Part("email") String email, 
         @Part("password") String password, 
         @Part("device_id") String device_id, 
         @Part("device_type") String device_type, 
         @Part("user_image") RequestBody file, 
         @Part("signup") String signup); 
+0

ThanQ Sir !!! Ça marche! : D –

+0

dans la méthode PUT est-il possible ??? @Lionel Briand –

+0

@KoVartthan Le comportement est le même que POST donc techniquement oui –

0
@Multipart 
@POST("/datingapp/index.php/Webservice") 
Call<Result> signupUser(@PartMap Map<String,String> queryMap, 
          @Part("user_image") RequestBody file); 

Ici, le @PartMap contient les autres paramètres nécessaires qui n'est une HashMap contenant la clé et les valeurs, par exemple

LinkedHashMap<String,String> map = new LinkedHashMap<String,String>(); 
map.put("user_name",username); 

comme ci-dessus et ainsi de suite.

-1

Faire un appel api comme ceci:

@POST("/datingapp/index.php/Webservice") 
@FormUrlEncoded 
@Multipart 
Call<Result> signupUser(@FieldMap LinkedHashMap<String, String> data,@Part RequestBody file); 

et de transmettre vos données sous forme de clé et la valeur en LinkedHashMap comme ceci

LinkedHashMap<String, String> data = new LinkedHashMap<>(); 
data.put("user_name", user_name); 
data.put("age", age); 
data.put("work", work); 
data.put("work", work); 
data.put("gender", gender); and so on .... 

pour obtenir l'image dedans Multiparts:

RequestBody file= RequestBody.create(MediaType.parse("image/jpeg"), file); 

dernier appel à frapper le api:

Call<Result> call = apiService.signupUser(data ,file); 

espère que cela fonctionne :)

+1

L'annotation '@ Multipart' ne peut pas être utilisée avec' @ FormUrlEncoded', et '@ FieldMap' doit être' @ PartMap' – Ninja