2015-02-05 14 views
5

Ich versuche, Bild mit Retrofit-Bibliothek hochzuladen. Dies ist, wie ich das Hochladen:Retrofit Multipart Upload Image fehlgeschlagen

Request Code:

@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()); 
        } 
       }) 

Antwort:

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]) 

Wenn ich über Client-Browser wie Postbote oder DHC bin Entsendung, die Anfrage ist die gleiche wie oben und ich bekomme eine erfolgreiche XML-Antwort.

Bitte sehen Sie den Screenshot auf meinem Versuch auf Postbote-Client. Es ist erfolgreich.

enter image description here

Antwort

8

Ich hatte auch die ähnlichen Probleme und nach wenigen Stunden haben mich endlich gebaut Bild-Upload-Funktionalität auf Remote-Server zu versuchen.
Um ein Bild hochzuladen, müssen Sie die API ordnungsgemäß erstellen und das Bild ordnungsgemäß übergeben. In Retrofit-Client müssen Sie das Bild einzurichten wie folgt:

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

    } 
}); 

API-Setup:

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

Remote Server Side PHP-Code, um das Bild handhaben:

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

Wenn es hilft irgendwer bitte erkennen Sie mich..danke viel ..

+0

Können Sie bitte einen Blick auf meinem [Versuch, ein Bild mit JSON-Daten zu senden] haben (http://stackoverflow.com/questions/29680158/how-to-send-multipart-form-data-with -retrofit)? – JJD

+0

in Android, mein Code-Look mag deine, aber immer noch 'Timeout', wenn ich Bild 1,5MB senden. kannst du mir helfen? –

+0

R Beasar, dies ist ein serverseitiges Problem. Sie müssen die Bildgröße auf dem Server-PHP-Code erhöhen. – techhunter

2

Für Retrofit 2.0 funktionierte das für mich

@Multipart 
    @Headers("Content-Type: application/json") 
    @POST("api/accounts/{id}/portrait") 
    Call<PortraitResponse> postPortrait(@Header("Authorization") String authorization, @Path("id") String id, @Part MultipartBody.Part file); 


    public void postPortrait(Uri uri) { 

     String auth = "Auth"; 
     String id = "someId"; 

     File file = new File(uri.getPath()); 

     // create RequestBody instance from file 
     RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpeg"), file); 

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

     postPortraitCall = getAccountClient().postPortrait(auth, id, body); 
     postPortraitCall.enqueue(new Callback<PortraitResponse>() { 
      @Override 
      public void onResponse(Call<PortraitResponse> call, Response<PortraitResponse> response) { 
       if (response.isSuccessful()) { 
        // Success 
       } else { 
        // Failed 
       } 
      } 

      @Override 
      public void onFailure(Call<PortraitResponse> call, Throwable t) { 
       // Failed 
      } 
    }); 

}