【问题标题】:Android Retrofit upload image file use multipart requestAndroid Retrofit 上传图片文件使用多部分请求
【发布时间】:2015-02-22 03:37:40
【问题描述】:

我是 android 改造的新手,需要使用多部分请求格式上传图像文件。 我能够使用 iphone 多部分请求成功上传。 但是,在进行 android 改造时遇到了麻烦。 我使用 https 和令牌持有者授权。

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

【问题讨论】:

  • SSL 连接有问题。在此处查看类似的 ssl 错误 code.google.com/p/android/issues/detail?id=65463
  • 我尝试了其他 get/post json 请求,除了上传文件请求外,其他所有请求都有效,所以可能还有其他问题。我删除了 ssl 并使用了常规的 http 请求,仍然出现错误
  • 嘿,你找到解决办法了吗?我面临同样的问题。 TIA
  • 我服务器的路由器似乎有问题,这段代码在另一台服务器上运行。

标签: android retrofit


【解决方案1】:

我觉得你的界面应该是这样的。

 @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 的初始化将是相同的,您的调用将是这样的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2020-05-31
    • 1970-01-01
    • 2017-02-25
    • 2016-09-25
    • 2017-02-11
    • 2019-02-06
    相关资源
    最近更新 更多