java - 发送带有改版的多部分POST请求的大文件时出错

原文 标签 java android retrofit2

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


将文件编码为base64并以文本形式发送到帖子正文中。
使用多部分请求并直接发送文件。


我尝试了它们,但是在两种方式下,我都有相同的问题:
当我发送小文件(例如500字节以下)时,我得到了成功的结果。
但是当我发送一个大文件时会发生问题。在超时结束之前,我什么也没收到,在AVD中我获得了成功的响应(在Postman中也是如此),但是在实际设备中(Android 5.1的HTC和Android 7.0的Samsung 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);
        }
    });
}

最佳答案

您可以发布错误的日志输出吗
它是否返回了像大型二进制数据之类的东西?

尝试这个:

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


}

关于java - 发送带有改版的多部分POST请求的大文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52353404/

相关文章:

android - NDEF向后兼容(Android Beam)

android - AsyncTask<String, Void, Void> 如何工作?

java - 被 List 和 retrofit2 和 foreach 卡住了

android - 如何替换已弃用的 okhttp.RequestBody.create()

java - 展平int数组列表

Java:如何通过忽略 "\n"逐行读取文件

java - Java多线程鼠标请点击

java - 如何避免 hibernate 中的字符串成员?

android - 带有arraylist的listview,android中的简单适配器

android - 如何重试消耗的Observable?