Ошибка при отправке большого файла с помощью многочастного POST-запроса - PullRequest
0 голосов
/ 16 сентября 2018

Я использую библиотеку retrofit2 для отправки данных на сервер, мне нужно загрузить файл или фотографию с запросом POST и получить ответ.Так что у меня есть два способа:

  1. Кодирование файла в base64 и отправка его в виде текста в теле сообщения.
  2. Использование запроса нескольких деталей и прямая отправка файла.

И я попробовал их, но у меня возникла одна и та же проблема:
при отправке небольших файлов (например, до 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);
        }
    });
}

1 Ответ

0 голосов
/ 16 сентября 2018

Можете ли вы опубликовать в журнале вывод вашей ошибки Возвратил ли он что-то вроде больших двоичных данных ??

Попробуйте это:

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

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...