Как отправить большое изображение файла через модификацию, которая уже работает в Postman, и для сервера nginx нет ограничений?

Я успешно создал одну демонстрацию для загрузки изображения через API. Если я выберу снимок экрана мобильного устройства, он будет работать нормально. но если я выберу большой файл, он не работает, за исключением: 413

onResponse: [size=208 text=<html>\r\n<head><title>413 Request Entity Too Large</title></head>…]

Итак, я искал эту проблему и нашел тысячи решений. Все говорят одно и то же. Выполните конфигурацию на стороне сервера, чтобы увеличить лимит

Но мой милый и простой вопрос: какое бы изображение не работало с модификацией, то же самое, что я пробовал с почтальоном, и оно работает! Как? А это означает, что дополнительных настроек на веб-сервере не требуется.

Теперь я сомневаюсь, что, возможно, сама Retrofit не позволяет использовать такие большие файлы. Тогда я должен попробовать с AsyncTask или может быть Volley?

Код: Заказчик модернизации:

package com.androidbuts.api;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;


/**
 * @author Pratik Butani
 */
public class RetroClient {

    /**
     * Upload URL of your folder with php file name...
     * You will find this file in php_upload folder in this project
     * You can copy that folder and paste in your htdocs folder...
     */
    private static final String ROOT_URL = "https://b2cprintappstg.e-arc.com/microservice/";
    /**
     * Get Retro Client
     *
     * @return JSON Object
     */

    static Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    public RetroClient() {

    }

    private static Retrofit getRetroClient() {
        return new Retrofit.Builder()
                .baseUrl(ROOT_URL)
                .client(getHeader())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }

    public static ApiService getApiService() {
        return getRetroClient().create(ApiService.class);
    }

    public static OkHttpClient getHeader() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient okClient = new OkHttpClient.Builder()
                .readTimeout(100, TimeUnit.SECONDS)
                .connectTimeout(100, TimeUnit.SECONDS)
                .writeTimeout(100, TimeUnit.SECONDS)
                .addInterceptor(interceptor)
                .addNetworkInterceptor(
                        new Interceptor() {
                            @Override
                            public Response intercept(Interceptor.Chain chain) throws IOException {
                                Request request = null;


                                Request original = chain.request();
                                // Request customization: add request headers
                                Request.Builder requestBuilder = original.newBuilder()
                                        .addHeader("ClientID", "xxxxxx")
                                        .addHeader("x-access-token", "3uYch6X1i2OuRd3DvBPvvwiMRqPboBdRt/PbSiP0KFB4eaQQFg==")
                                        .addHeader("PartnerID", "fV17XLswDUwlU9q9ofx4pkhezw==");


                                request = requestBuilder.build();

                                return chain.proceed(request);
                            }
                        })
                .build();
        return okClient;

    }
}

Служба API:

public interface ApiService {

    /*
    Retrofit get annotation with our URL
    And our method that will return us the List of Contacts
    */
    @Multipart
    @POST("user/new/api/design/files")

    Call<ResponseBody> uploadImage(@Part MultipartBody.Part file,
                                   @Part("design_id ") String designId);
}

person Community    schedule 23.04.2020    source источник


Ответы (2)


Я думаю, что виноват тайм-аут, который вы установили для OkHttp. Я бы сказал, установите для тайм-аута большее значение по мере необходимости.

OkHttpClient okClient = new OkHttpClient.Builder()
    .readTimeout(600, TimeUnit.SECONDS)
    .connectTimeout(600, TimeUnit.SECONDS)
    .writeTimeout(600, TimeUnit.SECONDS)
    .addInterceptor(interceptor)
    .addNetworkInterceptor(
            new Interceptor() {
                @Override
                public Response intercept(Interceptor.Chain chain) throws IOException {
                    Request request = null;


                    Request original = chain.request();
                    // Request customization: add request headers
                    Request.Builder requestBuilder = original.newBuilder()
                            .addHeader("ClientID", "xxxxxx")
                            .addHeader("x-access-token", "3uYch6X1i2OuRd3DvBPvvwiMRqPboBdRt/PbSiP0KFB4eaQQFg==")
                            .addHeader("Content-type", "multipart/form-data; boundary=" + "SomeRandomConstant");
                            .addHeader("PartnerID", "fV17XLswDUwlU9q9ofx4pkhezw==");


                    request = requestBuilder.build();

                    return chain.proceed(request);
                }
            })
    .build();

Кроме того, вы можете рассмотреть возможность установки уровня журнала в interceptor на NONE, как предложено здесь < / а>.

interceptor.setLevel(HttpLoggingInterceptor.Level.NONE);

Я цитирую Джейка Уортона из упомянутого выше вопроса.

Вызывая .setLogLevel(RestAdapter.LogLevel.FULL), вы заставляете Retrofit буферизовать все тело запроса в памяти, чтобы оно могло регистрироваться. Это то, что делает вызов readBodyToBytesIfNeeded в трассировке стека.

Включение такого ведения журнала должно выполняться только при отладке.

Также убедитесь, что вы добавили правильный Content-Type в заголовок запроса.

.addHeader("Content-type", "multipart/form-data; boundary=" + "SomeRandomConstant");

Пожалуйста, см. Ответ здесь, чтобы получить дополнительную информацию о настройке содержимого. тип.

Надеюсь, это поможет!

person Reaz Murshed    schedule 23.04.2020
comment
Привет, я забыл упомянуть, что я уже пробовал с МИНУТАМИ. а также я просто попробовал еще раз с 600 секундами и этим уровнем ведения журнала - person ; 23.04.2020
comment
Понятно. Похоже, вы не указали тип содержимого для своего запроса. См. Обновленный ответ. - person Reaz Murshed; 23.04.2020
comment
randomconstant string или int? - person ; 23.04.2020
comment
Строка @ShefaliSingh - person Reaz Murshed; 23.04.2020
comment
как строку? @ShefaliSingh - person Reaz Murshed; 23.04.2020
comment
Даже я сейчас пытаюсь использовать Volley, но это первый раз, когда я использую Volley, так что я просто настраиваюсь. 404 идет. - person ; 23.04.2020
comment
@ShefaliSingh, не могли бы вы опубликовать URL-адрес, заголовки и текст вашего почтальона. Я думаю, тебе не хватает ключей. Кроме того, опубликуйте журнал, который вы видите в своем logcat. Вы видите какие-либо ошибки относительно подтверждения SSL? - person Reaz Murshed; 24.04.2020
comment
Видишь, я ничего не упускаю. И здесь нет смысла выкладывать подробности. Потому что если мне чего-то не хватало, то почему маленькие изображения работают? Также я только что успешно сделал демо на Volley. Там тоже случилось то же самое. Работают изображения небольшого размера, а для изображения большого размера - 413. Также я уже писал об ошибке модернизации. И нет другого исключения. Идёт только 413! - person ; 24.04.2020
comment
@ShefaliSingh где вы устанавливаете тело Multipart? Я не вижу, чтобы вы отправляли файл с использованием multipart. Можете ли вы увидеть здесь этот ответ и загрузить свои изображения, используя составные части? stackoverflow.com/a/35175692/3145960 - person Reaz Murshed; 24.04.2020
comment
Я не добавил код. Потому что, когда я вызываю uploadImage, я передаю файл, выбранный на мобильном устройстве. это не та проблема. все идет правильно, но когда я выбираю изображение большого размера, то только у меня возникают проблемы. - person ; 25.04.2020
comment
Не могли бы вы помочь в этом, пожалуйста: stackoverflow.com/questions/61661282/ - person ; 08.05.2020
comment
Вы можете помочь? Вы можете помочь? stackoverflow.com/questions/61843230/ - person ; 17.05.2020
comment
@ShefaliSingh Я ответил на ваш другой вопрос. Пожалуйста, проверьте и дайте мне знать, поможет ли это! - person Reaz Murshed; 18.05.2020

попробуйте проверить сервер ngnix. и добавить конфигурацию

person Priyanka Singh    schedule 25.04.2020