Я загружаю файлы на серверы WebDav с помощью < /p>
RequestBody requestBody = new MultipartBody.Builder()
.addPart(RequestBody.create(data, MediaType.parse("application/binary")))
.build();
Request request = new Request.Builder()
.url(new URL(ci.URL))
.put(requestBody)
.build();
client.newCall(request).execute();
Хотя это работает для многих пользователей (с разными серверами), он не работает хотя бы для одного пользователя, использующего экземпляр NextCloud, возвращая 503.
Я сравнил с тем, что сделал Curl , и увидел, что он использует Chunked загрузки. Поэтому я заменил тело запроса < /p>
RequestBody requestBody = new RequestBody() {
@Override
public MediaType contentType() {
return MediaType.parse("application/binary");
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
try (InputStream in = new ByteArrayInputStream(data)) {
byte[] buffer = new byte[64 * 1024];
int read;
while ((read = in.read(buffer)) != -1) {
sink.write(buffer, 0, read);
sink.flush();
}
}
}
@Override
public long contentLength() {
return -1; // use chunked upload
}
};
< /code>
И это работает для этого конкретного сервера. < /p>
Мой вопрос: как я узнаю, лучше ли загрузка загруженной загрузки, чем загрузка "один блок"? Как узнать, поддерживает ли сервер вообще загруженной загрузкой? Как выбрать размер чанка? Похоже, что сервер имеет предел 2^16 байтов для одного запроса, но это может отличаться от сервера к серверу, не так ли? Для полноты, вот как я создаю своего клиента :
final OkHttpClient baseClient = new OkHttpClient();
...
OkHttpClient.Builder builder = baseClient.newBuilder();
final Map authCache = new ConcurrentHashMap();
com.burgstaller.okhttp.digest.Credentials credentials = new com.burgstaller.okhttp.digest.Credentials(ci.username, ci.password);
final BasicAuthenticator basicAuthenticator = new BasicAuthenticator(credentials);
final DigestAuthenticator digestAuthenticator = new DigestAuthenticator(credentials);
DispatchingAuthenticator authenticator = new DispatchingAuthenticator.Builder()
.with("digest", digestAuthenticator)
.with("basic", basicAuthenticator)
.build();
builder = builder.authenticator(new CachingAuthenticatorDecorator(authenticator, authCache))
.addInterceptor(new AuthenticationCacheInterceptor(authCache));
client = builder.build()
Подробнее здесь: https://stackoverflow.com/questions/795 ... ttp-or-not
Как решить, использовать ли загруженную загрузку в OKTTP или нет? ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1745599577
Anonymous
Я загружаю файлы на серверы WebDav с помощью < /p>
RequestBody requestBody = new MultipartBody.Builder()
.addPart(RequestBody.create(data, MediaType.parse("application/binary")))
.build();
Request request = new Request.Builder()
.url(new URL(ci.URL))
.put(requestBody)
.build();
client.newCall(request).execute();
Хотя это работает для многих пользователей (с разными серверами), он не работает хотя бы для одного пользователя, использующего экземпляр NextCloud, возвращая 503.
Я сравнил с тем, что сделал Curl , и увидел, что он использует Chunked загрузки. Поэтому я заменил тело запроса < /p>
RequestBody requestBody = new RequestBody() {
@Override
public MediaType contentType() {
return MediaType.parse("application/binary");
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
try (InputStream in = new ByteArrayInputStream(data)) {
byte[] buffer = new byte[64 * 1024];
int read;
while ((read = in.read(buffer)) != -1) {
sink.write(buffer, 0, read);
sink.flush();
}
}
}
@Override
public long contentLength() {
return -1; // use chunked upload
}
};
< /code>
И это работает для этого конкретного сервера. < /p>
Мой вопрос: как я узнаю, лучше ли загрузка загруженной загрузки, чем загрузка "один блок"? Как узнать, поддерживает ли сервер вообще загруженной загрузкой? Как выбрать размер чанка? Похоже, что сервер имеет предел 2^16 байтов для одного запроса, но это может отличаться от сервера к серверу, не так ли? Для полноты, вот как я создаю своего клиента :
final OkHttpClient baseClient = new OkHttpClient();
...
OkHttpClient.Builder builder = baseClient.newBuilder();
final Map authCache = new ConcurrentHashMap();
com.burgstaller.okhttp.digest.Credentials credentials = new com.burgstaller.okhttp.digest.Credentials(ci.username, ci.password);
final BasicAuthenticator basicAuthenticator = new BasicAuthenticator(credentials);
final DigestAuthenticator digestAuthenticator = new DigestAuthenticator(credentials);
DispatchingAuthenticator authenticator = new DispatchingAuthenticator.Builder()
.with("digest", digestAuthenticator)
.with("basic", basicAuthenticator)
.build();
builder = builder.authenticator(new CachingAuthenticatorDecorator(authenticator, authCache))
.addInterceptor(new AuthenticationCacheInterceptor(authCache));
client = builder.build()
Подробнее здесь: [url]https://stackoverflow.com/questions/79586563/how-to-decide-whether-to-use-chunked-upload-in-okhttp-or-not[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия