2016-09-07 5 views
1

이미지를 업로드하고 Retrofit 2을 사용하여 게시 방법으로 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

포스트 요청에 대해'@ Field' 대신'@ Body'를 사용해야한다고 생각합니다. – 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); 
} 

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

효과가있었습니다. 감사. :) –

관련 문제