2017-02-20 37 views
1

У меня есть функция для запроса загрузки изображения с Модернизированным как этогоКак загрузить изображение с помощью Android для Android?

void uploadPhoto(File file) { 
    RequestBody photo = RequestBody.create(MediaType.parse("application/image"), file); 
    RequestBody body = new MultipartBuilder() 
      .type(MultipartBuilder.FORM) 
      .addFormDataPart("photo", file.getName(), photo) 
      .build(); 

    fragment.showProgressDialog(fragment.loading); 
    fragment.getApi().uploadPhoto(PrefHelper.getString(PrefKey.TOKEN), body) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .subscribe(new Observer<GenericResponse>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 
        fragment.dismissProgressDialog(); 
        Timber.e(e.getMessage()); 
       } 

       @Override 
       public void onNext(GenericResponse response) { 
        fragment.dismissProgressDialog(); 

        if (response.getCode() == 1) { 
         fragment.showSuccessDialog("Saving success", false); 
         userInfo(); 
        } 

       } 
      }); 
} 

и для меня, например, кнопки, чтобы загрузить изображение в моем фрагменте

@OnClick(R.id.btnChangePicture) 
    void onChangePictureClicked() { 

} 

Какого код я должен положить в

OnChangePictureClicked

Так что я могу выбрать изображение из галереи, а затем я прошу его API.

недействительным uploadPhoto (файл File)

Благодаря

+0

У вас возникли проблемы с получением источника изображения или загрузкой на сервер? – TruongHieu

+0

моя проблема получает источник изображения @TruongHieu –

+0

Можете ли вы предоставить дополнительную информацию о том, какой источник вы пытались принять? Как галерея или камера или что-то ..? – TruongHieu

ответ

1

Transform изображение в массив байтов, а затем создать объект DTO, как на примере ниже, и отправить его на сервер через Модернизированный.

@Data 
public class SetProfileImageRequestDto { 
    @SerializedName("Token") 
    private String token; 

    @SerializedName("Stream") 
    private byte[] image; 

}

дооснащение служба Api:

@POST("SetProfileImage/") 
    Observable<ResultResponseDto> setProfileImage(@Body SetProfileImageRequestDto profileImageRequestDto); 

Надеется, что это работает.

+0

как получить изображение из галереи? как получить файл изображения или данные, которые я хочу отправить на сервер? –

+0

Ваше намерение ACTION_PICK вернет Uri, а затем проверьте это: http://stackoverflow.com/questions/10296734/image-uri-to-bytesarray – MGDiez

1

Создание объекта Uri в деятельности или фрагмента.

private Uri selectedImage; 

После этого вы получите результат в галерее onActivityResult.

 @Override 
      protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
       super.onActivityResult(requestCode, resultCode, data); 
       if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
        selectedImage = data.getData(); 
       } 
      } 

Тогда в вашем методе onChangePictureClicked.

@OnClick(R.id.btnChangePicture) 
     void onChangePictureClicked() { 
      if(selectedImage !=null){ 
      uploadPhoto(new File(selectedImage.getPath())); 
      } 
     } 
+0

это не работает –

0

Вы можете использовать multipart с модификацией, пожалуйста, посмотрите этот пример загрузки изображения с помощью модифицированного оборудования, что лучше для вас.

его работая для меня.

//Create Upload Server Client 
     ApiService service = RetroClient.getApiService(); 

     //File creating from selected URL 
     File file = new File(imagePath); 

     // create RequestBody instance from file 
     RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); 

     MultipartBody.Part body = 
       MultipartBody.Part.createFormData("uploaded_file", file.getName(), requestFile); 

     Call<Result> resultCall = service.uploadImage(body); 

     resultCall.enqueue(new Callback<Result>() { 
      @Override 
      public void onResponse(Call<Result> call, Response<Result> response) { 

       progressDialog.dismiss(); 

       // Response Success or Fail 
       if (response.isSuccessful()) { 
        if (response.body().getResult().equals("success")) 
         Snackbar.make(parentView, R.string.string_upload_success, Snackbar.LENGTH_LONG).show(); 
        else 
         Snackbar.make(parentView, R.string.string_upload_fail, Snackbar.LENGTH_LONG).show(); 

       } else { 
        Snackbar.make(parentView, R.string.string_upload_fail, Snackbar.LENGTH_LONG).show(); 
       } 

       /** 
       * Update Views 
       */ 
       imagePath = ""; 
       textView.setVisibility(View.VISIBLE); 
       imageView.setVisibility(View.INVISIBLE); 
      } 

      @Override 
      public void onFailure(Call<Result> call, Throwable t) { 
       progressDialog.dismiss(); 
      } 
     }); 

http://www.pratikbutani.com/2016/06/android-upload-image-file-using-retrofit-2-0/ 
+0

любой пример с Rx Java Observable? –