2016-04-15 19 views
8

Sto tentando di caricare un file (immagine) sul server utilizzando Retrofit 2. Sto seguendo quello tutorial che sembra abbastanza facile in un primo momento, ma non ha funzionato nel mio caso ...Errore durante il caricamento di un file utilizzando Retrofit 2

Quando chiamo la funzione API, sono sempre questo errore:

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) 

Qui è la mia chiamata API:

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

Ecco il metodo che uso per caricare un file:

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

Controllare la linea 575 di 'FragmentIncidentPlan.java' si sta utilizzando una matrice che va fuori di esso dei limiti. – Exaqt

+0

@Exaqt Quella riga è effettivamente nella mia domanda: chiama call = cobaltServices.upload (description, body); – Jaythaking

risposta

3

posso risolvere il mio problema utilizzando questo link: https://github.com/square/retrofit/issues/1063#issuecomment-145920568

Questa è la soluzione del problema:

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

chiamo seguendo modo.

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>() { } 

Il metodo toRequestBody solo converte stringa in RequestBody

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

Le eccezioni indicano che il primo @Part non ha bisogno di un nome nell'annotazione.

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

Ho aggiornato la mia domanda con il nuovo errore dopo aver rimosso la descrizione della parte ... – Jaythaking

+3

'Parametri @Part utilizzando il MultipartBody.Part non deve includere un nome di parte nell'annotazione. Dice che non si dovrebbe usare un nome. Quindi dovrebbe essere '@ Part' invece di' @Part ("description") ' – Exaqt

+0

Sì scusa Ho modificato il mio commento ... – Jaythaking