【发布时间】:2018-09-19 12:31:40
【问题描述】:
我正在使用 retrofit2 库将数据发布到服务器,我需要使用 POST 请求上传文件或照片并获得它的响应。所以我有两种方法:
- 将文件编码为 base64 并将其作为文本发送到帖子正文中。
- 使用多部分请求并直接发送文件。
我试过了,但在这两种方法中,我都有同样的问题:
当我发送小文件(例如 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);
}
});
}
【问题讨论】: