2015-02-05 26 views
5

Retrofit kütüphanesiyle görüntü yüklemeye çalışıyorum. Bu benim yüklüyorum nasıl:Retrofit Multipart Yükleme Resim başarısız oldu

talep Kodu:

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

Yanıt:

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]) 

Böyle postacı veya DHC olarak istemci tarayıcı üzerinden gönderme kulüpler, istek yukarıdaki ile aynıdır ve başarılı bir XML yanıtı alıyorum.

Lütfen, postacı istemcisindeki girişimde bulunan ekran görüntüsüne bakın. Bu başarılı.

enter image description here

cevap

8

Ben de benzer sorunlar vardı ve birkaç saat uzak sunucuya I nihayet olan resim yükleme işlevselliği denedikten sonra.
Resmi yüklemek için API'yi doğru bir şekilde oluşturmanız ve ayrıca görüntüyü düzgün bir şekilde iletmeniz gerekiyor.

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 kurulum: Görüntüyü işlemek için

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

Uzak Sunucu Tarafı PHP Kodu:

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

Eğer yardımı olacaksa takip olarak Retrofitler Client'ınızın görüntü ayarlamanız gerekir Herhangi biri beni tanımak lütfen .. çok teşekkürler ..

+0

[JSON verileriyle görüntü gönderme girişimi] 'ne bir göz atın (http://stackoverflow.com/questions/29680158/how-to-send-multipart-form-data-with -güçlendirme)? Android'de – JJD

+0

, kodum sizinkilere benziyor, ancak görüntüyü 1,5MB yukarı çıkardığımda hala "zaman aşımı". Bana yardımcı olabilir misiniz? –

+0

R Beasar, bu daha çok sunucu tarafı sorunudur. Sunucu PHP kodundaki görüntü boyutunu artırmanız gerekir. – techhunter

2

Retrofit 2.0 için bu benim için çalıştı

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

} 
İlgili konular