2017-09-07 3 views
0

Interface:image avec retrofit 2

@Multipart 
@POST("emp/passportupload") 
Single<ApiResponse> uploadPassportImage(@Query("passportnumber") String passportNumber, @Part MultipartBody.Part file); 

Appel api:

File file = new File(model.getImage().getPath()); 
if (!file.exists()) return null; 
RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file); 
MultipartBody.Part filePart = MultipartBody.Part.createFormData(ApiConstant.PICTURE_UPLOAD_PARAM, file.getName(), requestBody); 

dataService.uploadPassportImage(map, filePart) 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()); 

J'utilise cette méthode pour télécharger l'image sur le serveur mais le serveur ne peut pas valider comme une image, me donnant ainsi une réponse comme

"Le fichier fourni n'est pas valide P icture S'il vous plaît fournir un PNG/JPG Fichier »

Mais, je l'ai téléchargé le même fichier image par postier et il a réussi est la demande ici. (NB: passportnumber est un params, pas une des données de formulaire) enter image description here

Répondre

0

U peut essayer comme ceci u besoin de définir le paramètre de la carte comme un regard multipart l'exemple ci-dessous ici je passe à la fois userId et de l'image

RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file); 

MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("image", file.getName(), requestBody); 
MultipartBody.Part id = MultipartBody.Part.createFormData("userId", userId); 
Call<ProfilePicUpdateResponse> call = apiService.updateProfilePic(id,fileToUpload); 
+0

Dans mon cas, la différence est userid est pas de-données, il est un params. J'ai essayé cette solution, et obtenant la réponse d'erreur car le serveur n'a pas pu trouver la valeur de params. – CodeCameo

0
@POST("{path}") 
Call<Void> uploadFile(@Header("Content-Type") String type, @Body RequestBody photo, @Path("path") String path); 


    File file = new File("YOUR_FILE_URI"); 

    String filename = file.getName(); 
    String fileExtension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); 
    final String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension); 


    InputStream in = null; 
    RequestBody requestBody = null; 
    try { 
     in = new FileInputStream(file); 
     byte[] buf; 
     buf = new byte[in.available()]; 
     while (in.read(buf) != -1); 
     requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), buf); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    ApiConfig getResponse = AppConfig.getRetrofit().create(ApiConfig.class); 
    Call<Void> call = getResponse.uploadFile(type, requestBody , posturl); 
1
@Multipart 
@POST("changeCompanyLogo") 
Call<ChangeLogoResponse> changeCompanyLogo(@Part MultipartBody.Part image, @Part("JSON") RequestBody name); 

Dans le service écrire ce code

ChangeLogoAPI service = ServiceHandler.getClient().create(ChangeLogoAPI.class); 
     File file = new File(intent.getStringExtra("imagePath")); 
     RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); 
     MultipartBody.Part body = MultipartBody.Part.createFormData("companyLogo", file.getName(), reqFile); 
     RequestBody name = RequestBody.create(MediaType.parse("text/plain"), new Gson().toJson(new ChangeLogoParams())); 
     Call<ChangeLogoResponse> call = service.changeCompanyLogo(body, name); 
     call.enqueue(new Callback<ChangeLogoResponse>() { 
      @Override 
      public void onResponse(Call<ChangeLogoResponse> call, Response<ChangeLogoResponse> response) { 
       Log.d(TAG, "response: " + response.isSuccessful()); 


      } 

      @Override 
      public void onFailure(Call<ChangeLogoResponse> call, Throwable t) { 

      } 
     });