2017-05-29 4 views
0

私は正常にこのコードで改造を経て、私のREST APIにアップロード画像を設定します。Retrofit 2で空のファイルをアップロードするには?

 File imageFile = ImagePicker.getFileFromResult(this, resultCode, data); 
     RequestBody requestFile = 
       RequestBody.create(MediaType.parse("multipart/form-data"), imageFile); 
     MultipartBody.Part body = 
       MultipartBody.Part.createFormData("userpic", imageFile.getName(), requestFile); 

     RetrofitClient.compositeSubscription.add(RetrofitClient.getService().updateProfileUserpic("Token " + RevolutionApp.getInstance().getUserToken(), body).subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Observer<Profile>() { 
        @Override 
        public void onCompleted() { } 

        @Override 
        public void onError(Throwable e) { } 

        @Override 
        public void onNext(Profile profile) { 
         mProfileFragment.fetchProfileData(); 
        } 
       })); 

は今、私は私の私のAPIに空のファイル(null)を送信する必要があります。それを実装する方法は?

public void updateProfileData(ProfilePost profile, final OnProfileUpdatedListener listener) { 

    Observable<Profile> observable; 
    if (profile.getUserpicPart() != null) { 
     observable = RetrofitClient.getService().updateProfileData(profile.asHashMap(), profile.getUserpicPart()); 
    } else { 
     observable = RetrofitClient.getService().updateProfileData(profile.asHashMap()); 
    } 

    RetrofitClient.compositeSubscription.add(observable 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<Profile>() { 
       ... 
      })); 
} 

補強メソッドシグネチャ:

@PUT("/api/v1/profile/") 
@Multipart 
Observable<Profile> updateProfileData(@Header("Authorization") String authorization, @PartMap() Map<String, RequestBody> partMap, @Part MultipartBody.Part image); 

@PUT("/api/v1/profile/") 
@Multipart 
Observable<Profile> updateProfileData(@Header("Authorization") String authorization, @PartMap() Map<String, RequestBody> partMap); 

とモデルモデル更新する

APIインターフェース方法:

MultipartBody.Part.createFormData("userpic", imageFile.getName(), requestFile) 

ここ
+1

どのようにこの問題を解決しましたか教えてください – Rgv

+0

答えはこちらです。 –

答えて

0

動作しないが、最終的な解決策であります上OST:ヌルの代わりに、名前がnullであってはならないファイル:

public class ProfilePost { 
    MultipartBody.Part userpicPart; 

    public HashMap<String, RequestBody> asHashMap() { 
     HashMap<String, RequestBody> result = new HashMap<>(); 
     result.put("first_name", RequestBody.create(MediaType.parse("text/plain"), this.firstName)); 
     result.put("last_name", RequestBody.create(MediaType.parse("text/plain"), this.lastName)); 
     result.put("email", RequestBody.create(MediaType.parse("text/plain"), this.email)); 
    } 
    public void getUserpicPart() { 
     if (this.userpicFile == null) { 
      return null; 
     } 
     return MultipartBody.Part.createFormData("userpic", this.userpicFile.getName(), requestFile); 
    } 
} 
+1

あなたのサポートに感謝、私は別の方法で解決、私の答えをチェック – Rgv

0

私は、これは、これを行うための正しい方法であるかわからない、私は

MultipartBody.Part fileToUpload = null; 
     if (realPath != null) { 
      try { 
       File file = new File(realPath); 
       if (file.exists()) { 
        RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file); 
        fileToUpload = MultipartBody.Part.createFormData("attachment", file.getName(), requestBody); 
       } 
      } catch (NullPointerException e) { 
       e.printStackTrace(); 
      } 
     }else{ 
      RequestBody attachmentEmpty = RequestBody.create(MediaType.parse("text/plain"), ""); 

      fileToUpload = MultipartBody.Part.createFormData("attachment", "", attachmentEmpty); 
     } 

注作業this.itsのように試してみました空( "")を使用してください。

関連する問題