1
votes

Comment envoyer des photos au serveur avec des champs supplémentaires dans l'application Android?

J'essaie d'envoyer plusieurs photos au serveur avec Retrofit. J'ai un point de terminaison comme celui-ci:

int price;
String currency;
ArrayList<String> tags;

Mais je ne sais pas comment ajouter à cette méthode POST des informations supplémentaires avec:

@Multipart
@POST("/v1/props")
Call<ModelProp> createProp(
        @Header("x-auth") String token,
        @Part List<MultipartBody.Part> photo
);

Peut quelqu'un m'aide-t-il à ajouter ces champs à POST avec retrofit?

modifier: Le tableau peut contenir plus de 1000 éléments


5 commentaires

vous pouvez ajouter des informations supplémentaires à la chaîne de requête


Comment puis-je ajouter un tableau à la chaîne de requête? Y a-t-il un moyen?


lorsque vous créez une URL, vous pouvez y ajouter le paramètre de requête. Depuis le serveur, vous devrez traiter ces paramètres. HttpUrl url = originalHttpUrl.newBuilder () .addQueryParameter ("param1", "param1_value") .build ();


s'il vous plaît se référer à [ futurestud.io / tutoriels /…


Merci pour vos conseils, mais si j'ai 1000 éléments dans le tableau, ce n'est pas une bonne idée de l'ajouter à une chaîne de requête


3 Réponses :


2
votes

Dans Retrofit 2, vous pouvez lui envoyer des données supplémentaires avec l'image de la manière suivante:

Modifier: En fonction de la réponse d'Ali Ghafari, vous pouvez également utiliser PartMap

public RequestBody createPartFromString(String string) {
        return RequestBody.create(MultipartBody.FORM, string);
    }

Vous pouvez l'utiliser comme ceci:

  private MultipartBody.Part prepareFilePart(String partName, Uri fileUri){

    File file = new File(fileUri.getPath(););

    RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(fileUri)), file);

    return MultipartBody.Part.createFormData(partName, file.getName(),requestBody);
  }

prepareFilePart méthode

List<MultipartBody.Part> parts = new ArrayList<>();    
for (int i=0; i < upFileList.size(); i++){
   parts.add(prepareFilePart("my_file["+i+"]", upFileList.get(i)));
}
Map<String, RequestBody> partMap = new HashMap<>();
partMap.put("price", createPartFromString(edtPrice.getText().toString()));
partMap.put("currency", createPartFromString(edtCurrency.getText().toString()));
partMap.put("tags", createPartFromString(new Gson().toJson(tagsArrayList));
Call<User> call = client.createProp(TokenUtils.getToken(this), partMap);
call.enqueue(new Callback<ModelProp>() {
    @Override
    public void onResponse(retrofit.Response<ModelProp> response, Retrofit retrofit) {
        // consume response
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
});

Méthode createPartFromString

public interface ApiInterface {
    @Multipart
    @POST("/v1/props")
    Call<ModelProp> createProp(@Header("x-auth") String token, 
                      @Part List<MultipartBody.Part> photo,
                      @PartMap Map<String, RequestBody> map
}


3 commentaires

Cela semble vrai, le vérifiera avec le code et marquera la réponse. Merci!


d'où puis-je obtenir la méthode getPath () dans un nouveau fichier (getPath (fileUri))?


fileUri.getPath () - donne une erreur onFailure: / external / images / media / 63927 (aucun fichier ou répertoire de ce type)



0
votes

changez votre interface en ceci:

 public RequestBody createPartFromString(String string) {
        return RequestBody.create(MultipartBody.FORM, string);
    }

et utilisez ces codes pour obtenir des cartes et les envoyer à createProp :

    public Map<String, RequestBody> getMap() {
        Map<String, RequestBody> partMap = new HashMap<>();
        String authorS = author.getText().toString();
        partMap.put("price", createPartFromString(price));

        // you can put more filed to partMap

        return partMap;
     }


1 commentaires

Comment ajouter un tableau à cela?



0
votes

Option1: Utilisez plusieurs @Part et transmettez vos arguments normalement.

RequestBody price = ...
RequestBody currency = ...
RequestBody tags = ...

HashMap<String, RequestBody> map = new HashMap<>();  
map.put("price", description);  
map.put("currency", place);  
map.put("tags", time);

Option2: Utilisez @PartMap et faites une carte inclure vos données.

@Multipart
@POST("/v1/props")
Call<ModelProp> createProp(
        @Header("x-auth") String token,
        @Part List<MultipartBody.Part> photo,
        @PartMap Map<String, RequestBody> dataMap
);

et créez une carte de données à transmettre p>

@Multipart
@POST("/v1/props")
Call<ModelProp> createProp(
        @Header("x-auth") String token,
        @Part List<MultipartBody.Part> photo,
        @Part("price") int price,
        @Part("currency") String currency,
        @Part("tags") List<String> tags
);


0 commentaires