2017-09-07 2 views
0

Schnittstelle:Bild hochladen mit Retrofit 2

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

Aufruf 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()); 

ich diese Methode bin mit Bild auf den Server hochgeladen werden aber Server nicht überprüfen kann, wie ein Bild, daher gibt mir eine Antwort wie

"Bereitgestellte Datei ist nicht eine gültige P Bild. Bitte geben Sie eine PNG/JPG-Datei“

Aber, ich habe die gleiche Bilddatei durch Postbote hochgeladen und es war erfolgreich Hier ist die Anfrage. (NB: Personalausweis-ist ein params, keine Formulardaten) enter image description here

Antwort

0

U kann so versuchen u brauchen Karte Parameter einzustellen, wie ein multipart Blick auf das folgende Beispiel hier ich vorbei bin beide userId und Bild

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

In meinem Fall ist der Unterschied Benutzer-ID ist kein aus-Daten, ist es ein params ist. Ich habe diese Lösung versucht und eine Fehlerantwort erhalten, da der Server den Parameterwert nicht finden konnte. – 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); 

In Dienst schreiben Dieser 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) { 

      } 
     });