Retrofit Multipart Upload Image failed
Asked Answered
H

2

6

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

Houdon answered 5/2, 2015 at 15:50 Comment(1)
is your problem solved? I am also facing similar kind of issue.Zirconium
P
8

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..

Presumably answered 4/3, 2015 at 16:12 Comment(3)
Can you please have a look at my attempt to send a image with JSON data?Solubility
in Android, my code look likes yours, but still timeout when i send image 1.5MB up. can you help me?Actinopod
R Beasar, this is more server side problem. You need to increase the image size on the server PHP code.Presumably
D
3

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

}
Dragonroot answered 1/6, 2016 at 14:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.