【问题标题】:Error in sending large file with retrofit multipart POST request使用改造多部分 POST 请求发送大文件时出错
【发布时间】:2018-09-19 12:31:40
【问题描述】:

我正在使用 retrofit2 库将数据发布到服务器,我需要使用 POST 请求上传文件或照片并获得它的响应。所以我有两种方法:

  1. 将文件编码为 base64 并将其作为文本发送到帖子正文中。
  2. 使用多部分请求并直接发送文件。

我试过了,但在这两种方法中,我都有同样的问题:
当我发送小文件(例如 500 字节以下)时,我得到了成功的结果。
但是当我发送一个大文件时会出现问题。在超时结束之前我什么都没有得到,在 AVD 中我得到了成功的响应(也在 Postman 中),但在真实设备中(带有 android 5.1 的 HTC 和带有 Android 7.0 的三星 S6)会发生以下错误:

java.io.IOException: unexpected end of stream on Connection{myIp:port, proxy=DIRECT@ hostAddress=/myIp:port cipherSuite=none protocol=http/1.1

调用方法:

@Multipart
@POST("uploaddata")
Call<ResponseBody> uploaddate(@Part("file") RequestBody filePart, @Part("token") RequestBody token,
                              @Part("type") RequestBody type, @Part("name")RequestBody name);

主要方法:

public void uploadImage(String type, File file, String name, String token, final DataInterface listener) {

    RequestBody filePart = RequestBody.create(MediaType.parse("image/*"), file);
    RequestBody tokenPart = RequestBody.create(MediaType.parse("text/plain"), token);
    RequestBody namePart = RequestBody.create(MediaType.parse("text/plain"), name);
    RequestBody typePart = RequestBody.create(MediaType.parse("text/plain"), type);

    Call<ResponseBody> uploadData = apiInterface.uploaddate(filePart, tokenPart, typePart, namePart);
    uploadData.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {

                listener.onResponseListener(response.body());

            } else {

                Log.e(TAG, "uploadData -----> response.isSuccessful == false");

            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.e(TAG, "uploadData onFailure -----> " + t);
        }
    });
}

【问题讨论】:

    标签: java android retrofit2


    【解决方案1】:

    你能发布你的错误的日志输出吗 它是否返回了类似大型二进制数据的东西??

    试试这个:

    @Multipart
    @POST("uploaddata")
    Call<ResponseBody> uploaddate(@Part MultiPart.Body filePart, 
    @Part("token") RequestBody token,
                              @Part("type") RequestBody type, 
    @Part("name")RequestBody name);
    

    主要方法:

    public void uploadImage(String type, File file, String name, String token, 
    final DataInterface listener) {
    
    RequestBody filePart = RequestBody.create(MediaType.parse("image/*"), file);
    MultiPartBody.Part body = MultiPartBody.Part.createFormData("filePart",file.getName(),filePart);
    RequestBody tokenPart = RequestBody.create(MediaType.parse("text/plain"), token);
    RequestBody namePart = RequestBody.create(MediaType.parse("text/plain"), name);
    RequestBody typePart = RequestBody.create(MediaType.parse("text/plain"), type);
    
    Call<ResponseBody> uploadData = apiInterface.uploaddate(body, tokenPart, typePart, namePart);
    uploadData.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
    
                listener.onResponseListener(response.body());
    
            } else {
    
                Log.e(TAG, "uploadData -----> response.isSuccessful == false");
    
            }
        }
    
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.e(TAG, "uploadData onFailure -----> " + t);
        }
    });
    

    }

    【讨论】:

    • Logcat 错误:java.io.IOException: unexpected end of stream on Connection{myIp:port, proxy=DIRECT@ hostAddress=/myIp:port cipherSuite=none protocol=http/1.1
    • 它是否返回了类似这样的内容:D/OkHttp: ������JFIF������������������C��
    • @DilipKrishna 在我的情况下它确实返回了这个,所以可能是什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2011-05-06
    相关资源
    最近更新 更多