2015-02-05 23 views
5

Sto tentando di caricare l'immagine con la libreria Retrofit. Questo è come sto caricando:Retrofit Immagine caricamento multipart.

Codice Richiesta:

@Multipart 
@POST("/customerapp/{context}/{token}/passenger/passport/add/{passengerId}") 
@Headers({ 
     "Accept: application/xml", 
     "Accept-Encoding: gzip" 
}) 
void UploadImage(
     @Path("context") String context, 
     @Path("token") String token, 
     @Path("passengerId") String passengerId, 
     @Query("fileType") String fileType, 
     @Query("imageCategory") int imageCategory, 
     @Part("imageContent") TypedFile file, 
     Callback<VJSuccessResponse> callback 
); 



public static final String BASE_URL = 
    "http://webservicetest.abc.com/extranetServices/1.1"; 

RequestInterceptor requestInterceptor = new RequestInterceptor() { 
      @Override 
      public void intercept(RequestFacade request) { 
       Log.e("Retrofit Request Body", request.toString()); 
      } 
     }; 

     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(BackendConstants.BASE_URL) 
       .setClient(new OkClient(new OkHttpClient())) 
       .setConverter(new SimpleXMLConverter()) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .setRequestInterceptor(requestInterceptor) 
       .build(); 

     REST_CLIENT = restAdapter.create(BackendAPI.class); 

     REST_CLIENT.UploadImage(
       BackendConstants.CONTEXT, 
       StateObject.sSPManager.getStoredPersonalDetails().getToken(), 
       passengerId, 
       new File(filePath), 
       imageCategory, 
       new TypedFile("image/jpeg", typeFile), new Callback<VJSuccessResponse>() { 
        @Override 
        public void success(VJSuccessResponse getCallResponse, Response response) { 

        } 

        @Override 
        public void failure(RetrofitError error) { 


         Log.d(TAG, error.toString()); 
        } 
       }) 

Risposta:

HTTP POST http://webservicetest.abc.com/extranetServices/1.1/customerapp/customerapp/cba75eb0d5d64e16b37cca477d68d836/passenger/passport/add/56672?fileType=jpg&imageCategory=1 
Accept: application/xml 
Accept-Encoding: gzip 
Content-Type: multipart/form-data; boundary=fb1f78df-d674-4e54-9b41-32a386ca4222 
Content-Length: 6038770 
Content-Disposition: form-data; name="imageContent"; filename="userdp.jpg" 
Content-Type: image/jpeg 
Content-Length: 6038513 

Content-Transfer-Encoding: binary 
    ������JFIF����������������C������C�����,"�������������������������� 
    �����������}��!1AQa"q2���#B��R��$3br� 
(That goes long String of garbage...) 


<--- HTTP 200 http://webservicetest.abc.com/extranetServices/1.1/customerapp/customerapp/cba75eb0d5d64e16b37cca477d68d836/passenger/passport/add/56672?fileType=jpg&imageCategory=1 (109092ms) 
Date: Thu, 05 Feb 2015 14:52:28 GMTServer: GlassFish Server Open Source Edition 3.1.2.2 
X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2.2 Java/Sun Microsystems Inc./1.6) 
Content-Encoding: gzip 
Content-Type: application/xml 
Content-Length: 108 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
OkHttp-Selected-Protocol: http/1.1 
OkHttp-Sent-Millis: 1423148584220 
OkHttp-Received-Millis: 1423148693098 
��������������������Q(K-*��ϳU2�3PRH�K�O��K�U 
    qӵPR(.I�KI���K�U�L-V���)� 
    J-.��+N��).MNN-.�+)*M�ч�l�������u��g������ 
<--- END HTTP (108-byte body) 
retrofit.RetrofitError: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT �������������������[email protected]:38 in [email protected]) 

Se sto inviando via browser client come postino o DHC, la richiesta è la stessa di cui sopra e ottengo una risposta XML di successo.

Per favore, guarda lo screenshot sul mio tentativo sul client postino. Ha successo

enter image description here

risposta

8

Ho anche avuto problemi simili e dopo poche ore cercando Ho funzionalità caricamento delle immagini, infine, costruito per server remoto.
Per caricare l'immagine è necessario creare correttamente l'API e inoltre è necessario passare correttamente l'immagine. In cliente Retrofit è necessario impostare l'immagine come segue:

String photoName = "20150219_222813.jpg"; 
File photo = new File(photoName); 
TypedFile typedImage = new TypedFile("application/octet-stream", photo); 

RetrofitClient.uploadImage(typedImage, new retrofit.Callback<Photo>() { 

    @Override 
    public void success(Photo photo, Response response) { 
     Log.d("SUCCESS ", "SUCCESS RETURN " + response); 
    } 

    @Override 
    public void failure(RetrofitError error) { 

    } 
}); 

configurazione API:

@Multipart 
@POST("/") 
void uploadImage(@Part("file") TypedFile file, Callback<Photo> callback); 

server remoto di codice PHP lato per gestire l'immagine:

$pic = 'uploaded_images/' . $imagename . '.jpg'; 
if (!move_uploaded_file($_FILES['file']['tmp_name'], $pic)) { 
    echo "posted"; 
} 

se aiuta Qualcuno per favore mi riconosce..grazie molto ..

+0

Potete dare un'occhiata al mio [tentativo di inviare un'immagine con dati JSON] (http://stackoverflow.com/questions/29680158/how-to-send-multipart-form-data-with -retrofit)? – JJD

+0

in Android, il mio codice sembra come il tuo, ma ancora 'timeout' quando invio immagine 1.5MB in su. Mi potete aiutare? –

+0

R Beasar, questo è più un problema lato server. È necessario aumentare la dimensione dell'immagine sul codice PHP del server. – techhunter

2

Per Retrofit 2.0 questo ha funzionato per me