2015-02-05 8 views
5

Я пытаюсь загрузить изображение с помощью библиотеки дооснащения. Это, как я отправляю:Retrofit Multipart Загрузить изображение не удалось

Код запроса:

@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 �������������������[email protected]:38 in [email protected]) 

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

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

enter image description here

ответ

8

Я также имел аналогичные проблемы и после нескольких часов попыток я, наконец, построили функциональность загрузки изображения на удаленный сервер.
Чтобы загрузить картинку, вам необходимо правильно создать 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); 

Remote Server Side PHP код для обработки изображения:

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

Если это помогает любой из них, пожалуйста, узнайте меня .. многое. ..

+0

Можете ли вы посмотреть на мою [попытку отправить изображение с данными JSON] (http://stackoverflow.com/questions/29680158/how-to-send-multipart-form-data-with -retrofit)? – JJD

+0

в Android, мой код выглядит как ваш, но все равно «тайм-аут», когда я отправляю изображение 1,5 МБ вверх. можешь мне помочь? –

+0

R Beasar, это больше проблем на стороне сервера. Вам нужно увеличить размер изображения на PHP-сервере сервера. – techhunter

2

Для дооснащения 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 
      } 
    }); 

}