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.
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..
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
}
});
}
来源:https://stackoverflow.com/questions/28348269/retrofit-multipart-upload-image-failed