2016-09-07 14 views
1

我必須上傳圖片,並使用Retrofit 2以post方法發送String數據。我正在使用流動的方法來做到這一點。在Retrofit 2.0中發送文件和字符串值製作錯誤

@Multipart 
@FormUrlEncoded 
@POST("signup/step3") 
Call<BasicModel> completeRegistration(
    /*All Basic Parameter*/ 
    @Field("mobile_no") String mobileNo, 

    /*For User Image*/ 
    @Part MultipartBody.Part photoFile 

); 

但我收到以下錯誤。

java.lang.IllegalArgumentException: Only one encoding annotation is allowed. 
     for method AllNetworkCalls.completeRegistration 
     at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:695) 
     at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:686) 
     at retrofit2.ServiceMethod$Builder.parseMethodAnnotation(ServiceMethod.java:266) 
     at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:169) 
     at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166) 
     at retrofit2.Retrofit$1.invoke(Retrofit.java:145) 
     at java.lang.reflect.Proxy.invoke(Proxy.java:397) 
     at $Proxy1.completeRegistration(Unknown Source) 
     at com.sslwireless.app.Activities.SignUp.RegistrationActivity_5.completeRegistration(RegistrationActivity_5.java:244) 
     at com.sslwireless.app.Activities.SignUp.RegistrationActivity_5.access$1100(RegistrationActivity_5.java:51) 
     at com.sslwireless.app.Activities.SignUp.RegistrationActivity_5$5.onClick(RegistrationActivity_5.java:132) 
     at android.view.View.performClick(View.java:4856) 
     at android.view.View$PerformClick.run(View.java:19956) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:211) 
     at android.app.ActivityThread.main(ActivityThread.java:5389) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 

有沒有其他辦法可以做到這一點?

+0

我不認爲你可以使用'@ FormUrlEncoded'和'@ Multipart'一起爲同樣的要求。嘗試刪除FromUrlEncoded它應該工作 – MBH

+0

是我刪除'@ FromUrlEncoded'然後我得到'@ Field'的錯誤。 –

+0

我認爲你需要使用'@ Body'而不是'@ Field'來表示它是Post請求 – MBH

回答

2

使用Retrofit 2,您需要使用OkHttp的RequestBody或MultipartBody.Part類,並將您的文件封裝到請求正文中。讓我們來看看文件上傳的界面定義。

public interface FileUploadService { 
    @Multipart 
    @POST("upload") 
    Call<ResponseBody> upload(@Part("description") RequestBody description, 
           @Part MultipartBody.Part file); 
} 

中的Java文件

private void uploadFile(Uri fileUri) { 
    // create upload service client 
    FileUploadService service = 
      ServiceGenerator.createService(FileUploadService.class); 

    // https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java 
    // use the FileUtils to get the actual file by uri 
    File file = FileUtils.getFile(this, fileUri); 

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

    // MultipartBody.Part is used to send also the actual file name 
    MultipartBody.Part body = 
      MultipartBody.Part.createFormData("picture", file.getName(), requestFile); 

    // add another part within the multipart request 
    String descriptionString = "hello, this is description speaking"; 
    RequestBody description = 
      RequestBody.create(
        MediaType.parse("multipart/form-data"), descriptionString); 

    // finally, execute the request 
    Call<ResponseBody> call = service.upload(description, body); 
    call.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, 
           Response<ResponseBody> response) { 
      Log.v("Upload", "success"); 
     } 

     @Override 
     public void onFailure(Call<ResponseBody> call, Throwable t) { 
      Log.e("Upload error:", t.getMessage()); 
     } 
    }); 
} 
+0

你可以分享'RequestBody'的參數嗎? –

+0

它的工作。謝謝。 :) –

相關問題