2014-12-24 84 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()); 
       } 
      }); 
相关问题