2016-04-15 19 views
8

Retrofit 2を使用してファイル(画像)をサーバーにアップロードしようとしています。Retrofit 2を使用してファイルをアップロード中にエラーが発生しました

W/System.err: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 
W/System.err:  at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:190) 
W/System.err:  at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166) 
W/System.err:  at retrofit2.Retrofit$1.invoke(Retrofit.java:145) 
W/System.err:  at java.lang.reflect.Proxy.invoke(Proxy.java:393) 
W/System.err:  at com.plante.android.cobalt.fragment.FragmentIncidentPlan.uploadFile(FragmentIncidentPlan.java:575) 

:私は、私はAPI関数を呼び出すと、最初はとても簡単そうですtutorialが、私の場合には動作しませんでした...

が、私は常に、このエラーを取得していますことを、次のよ

@Multipart 
@POST(Constants.URL_UPLOAD) 
Call<ResponseBody> upload(@Part RequestBody description, 
          @Part MultipartBody.Part file); 

ここで私は、ファイルをアップロードするために使用する方法である:ここには私のAPIコールがあります3210

private void uploadFile(String path) { // create upload service client // use the FileUtils to get the actual file by uri File file = new File(path); Log.e(TAG, file.getAbsolutePath()); // 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 = cobaltServices.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

チェックライン575に文字列を変換する方法。 – Exaqt

+0

@Exaqtその行は実際には私の質問です:Call call = cobaltServices.upload(description、body); – Jaythaking

答えて

3

私は、このリンクを使用して、私の問題を修正:https://github.com/square/retrofit/issues/1063#issuecomment-145920568

は、これが問題の解決策です:

@Multipart 
@POST ("/api/Events/editevent") 
Call<Event> editEvent (@PartMap Map<String, RequestBody> params); 

私は道に従うことによってそれを呼び出します。

Map<String, RequestBody> map = new HashMap<>(); 
map.put("Id", AZUtils.toRequestBody(eventId)); 
map.put("Name", AZUtils.toRequestBody(titleView.getValue())); 

if (imageUri != null) { 
     File file = new File(imageUri.getPath()); 
     RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file); 
     map.put("file\"; filename=\"pp.png\"", fileBody); 
} 

Call<Event> call = api.editEvent(map); 
call.enqueue(new Callback<Event>() { } 

あなたはそれの境界の外に出るのアレイを使用しているFragmentIncidentPlan.java` toRequestBodyはちょうど `のRequestBody

public static RequestBody toRequestBody (String value) { 
    RequestBody body = RequestBody.create(MediaType.parse("text/plain"), value); 
    return body ; 
} 
6

例外では、最初の@Partはアノテーションに名前を必要としないと記載されています。

@Multipart 
@POST(Constants.URL_UPLOAD) 
Call<ResponseBody> upload(@Part RequestBody description, 
          @Part MultipartBody.Part file); 
+0

パートの説明を削除した後、新しいエラーで質問を更新しました... – Jaythaking

+3

'MultipartBody.Partを使用した@Partパラメータは、アノテーションにパート名を含めてはいけません.'では、名前を使用しないでください。 – Exaqt

+0

はい、申し訳ありません私のコメントを編集しました... – Jaythaking