Не удалось дооснастить многокомпонентную загрузку изображения

Я пытаюсь загрузить изображение с помощью библиотеки Retrofit. Вот как я загружаю:

Код заявки:

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

Ответ:

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)

Если я отправляю сообщение через клиентский браузер, такой как почтальон или DHC, запрос будет таким же, как указано выше, и я получаю успешный XML-ответ.

Пожалуйста, посмотрите скриншот моей попытки использовать почтальон-клиент. Это успешно.

введите описание изображения здесь


person Omama    schedule 05.02.2015    source источник
comment
ваша проблема решена? Я тоже сталкиваюсь с подобной проблемой.   -  person Kameswari    schedule 19.06.2019


Ответы (2)


У меня также были похожие проблемы, и после нескольких часов попыток я наконец построил функцию загрузки изображений на удаленный сервер.
Чтобы загрузить изображение, вам необходимо правильно создать API, а также правильно передать изображение. В клиенте Retrofit вам необходимо настроить изображение следующим образом:

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:

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

PHP-код удаленного сервера для обработки изображения:

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

Если это кому-то поможет, узнайте меня ... большое спасибо ..

person techhunter    schedule 04.03.2015
comment
Не могли бы вы взглянуть на мою попытку отправить изображение с данными JSON? - person JJD; 21.04.2015
comment
в Android мой код похож на ваш, но все равно timeout, когда я отправляю изображение на 1,5 МБ больше. можешь помочь мне? - person R Besar; 08.09.2016
comment
R Beasar, это скорее проблема на стороне сервера. Вам необходимо увеличить размер изображения на сервере PHP кода. - person techhunter; 12.09.2016

Для Retrofit 2.0 это сработало для меня

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

}
person Tristan Richard    schedule 01.06.2016