Retrofit Multipart Upload Image failed

14,859

Solution 1

I also had the similar problems and after few hours trying I finally built image uploading functionality to remote server.
To upload image you need to create the API properly and also need to pass the image properly. In Retrofit client you need to set up the image as followed:

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 to handle the image:

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

If it helps any one please recognize me..thanks a lot..

Solution 2

For Retrofit 2.0 this worked for me

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

}
Share:
14,859
Omama
Author by

Omama

Love Android...

Updated on June 27, 2022

Comments

  • Omama
    Omama almost 2 years

    I am trying to upload image with Retrofit library. This is how I am uploading:

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

    Response:

    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 �������������������Q...@3:38 in java.io.InputStreamReader@26e1231a)
    

    If I am posting via client browser such as postman or DHC, the request is the same as above and I get a success XML response.

    Please, see the screenshot on my attempt on postman client. It is successful.

    enter image description here