2014-12-24 116 views
4

我是android新手,需要使用多部分請求格式上傳圖像文件。 我能夠使用iPhone多部分請求成功上傳。 但是,安卓系統改造時遇到了麻煩。 我使用https和令牌承載者授權。Android Retrofit上傳圖像文件使用多部分請求

@Multipart 
@POST("/Api/ApiSales/UploadImages") 
void uploadImage(@Part("File") TypedFile file, 
         Callback<Response> callback); 

RestAdapter.Builder builder = new RestAdapter.Builder().setEndpoint(appController.getInstance().getURL()); 
      builder.setRequestInterceptor(new RequestInterceptor() { 
       @Override 
       public void intercept(RequestFacade request) { 
        request.addHeader("Authorization", appController.getInstance().getAuthTokenString()); 
       } 
      }); 
      builder.setLogLevel(RestAdapter.LogLevel.FULL); 

      RestAdapter restAdapter = builder.build(); 

      RetrofitService service = restAdapter.create(RetrofitService.class); 
      service.uploadImage(new TypedFile("image/png",toFile), new Callback<retrofit.client.Response>() { 
       @Override 
       public void success(retrofit.client.Response response, retrofit.client.Response response2) { 
        Log.i(TAG, response.toString()); 
       } 

       @Override 
       public void failure(RetrofitError error) { 
        Log.e(TAG, error.toString()); 
       } 
      }); 

我得到了以下錯誤:

retrofit.RetrofitError: Write error: ssl=0x5ef8ad40: I/O error during system call, Connection reset by peer  

我設立了服務器的HTTP請求,仍然得到了錯誤:

retrofit.RetrofitError: sendto failed: ECONNRESET (Connection reset by peer) 
+0

某處有問題,SSL連接。看到這裏https://code.google.com/p/android/issues/detail?id=65463 –

+0

我試過其他GET/POST請求的JSON類似SSL錯誤,所有的工作除了上傳文件的要求,所以也許別的東西是錯誤的。我刪除了ssl並使用了常規的http請求,仍然有錯誤 –

+0

嘿,你找到了解決辦法嗎?我面臨同樣的問題。 TIA – Abhinav

回答

0

我覺得你的界面應該是這樣的。

@Multipart 
    @POST("/Api/ApiSales/UploadImages") 
    void uploadImage(@Header("Authorization") String user, 
    @Part("File") TypedFile file, Callback<Response> callback); 

你應該首先從onActivityResult

final String imagePath = getRealPathFromURI(imageUri); 

得到您的真實圖像路徑和getRealPathFromURI會是這樣。

private String getRealPathFromURI(Uri contentUri) { 
     String[] projection = {MediaStore.Images.Media.DATA}; 
     CursorLoader loader = new CursorLoader(this, contentUri, projection, null, null, null); 
     Cursor cursor = loader.loadInBackground(); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     String result = cursor.getString(column_index); 
     cursor.close(); 
     return result; 
    } 

和你TypedFile

File photoFile = new File(imagePath);// image will be your real path 
     String mimeType = getMimeType(imagePath); 
     TypedFile photoTypedFile; 
     if (mimeType != null) { 
      photoTypedFile = new TypedFile(mimeType, photoFile); 
     } else { 
      photoTypedFile = new TypedFile("image/jpg", photoFile); 
     } 

和你對你的Restadapter的intialize的intialize將是相同的,只是加入的頁眉和您的通話將被等。

RetrofitService service = restAdapter.create(RetrofitService.class); 
      service.uploadImage("yourAuthorization", photoTypedFil, new Callback<retrofit.client.Response>() { 
       @Override 
       public void success(retrofit.client.Response response, retrofit.client.Response response2) { 
        Log.i(TAG, response.toString()); 
       } 

       @Override 
       public void failure(RetrofitError error) { 
        Log.e(TAG, error.toString()); 
       } 
      }); 
相關問題