Я использую библиотеку retrofit2 для отправки данных на сервер, мне нужно загрузить файл или фотографию с запросом POST и получить ответ.Так что у меня есть два способа:
- Кодирование файла в base64 и отправка его в виде текста в теле сообщения.
- Использование запроса нескольких деталей и прямая отправка файла.
И я попробовал их, но у меня возникла одна и та же проблема:
при отправке небольших файлов (например, до 500 байт) я получаю успешный результат.
Но проблема возникает, когда яотправить большой файл.Я не получаю ничего до истечения времени ожидания, в AVD я получаю успешный ответ (также в Почтальоне), но в реальных устройствах (HTC с Android 5.1 и Samsung S6 с Android 7.0) возникает ошибка ниже:
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);
}
});
}