Я пытаюсь загрузить файл на сервер с помощью HttpUrlConnection.
AFAIU, передавая размер буфера в setChunkedStreamingMode, позволяет избежать нехватки памяти при передаче больших файлов через HttpUrlConnection. Источник моего вывода
Ниже я предоставил сокращенную версию своего кода, которая работает, пока setChunkedStreamingMode комментируется. Но раскомментирование setChunkedStreamingMode вызывает «Исключение сокета. Сломанный канал»
Я не уверен, правильно ли я его использую. Может ли кто-нибудь помочь мне, подсказав, как использовать setChunkedStreamingMode
Код:
try{
val dataStream = applicationContext.contentResolver.openInputStream(Uri.parse(fileUri))
val url = URL(urlString)
val httpConnection = url.openConnection() as HttpURLConnection
for (i in keys.indices) {
httpConnection.setRequestProperty(keys, values)
}
httpConnection.requestMethod = "POST"
httpConnection.doOutput = true
// setting the chunked mode. Causing Socket exception.
// httpConnection.setChunkedStreamingMode(DEFAULT_BUFFER_SIZE * 2)
val outPutStream = BufferedOutputStream(httpConnection.outputStream)
var bytesCopied: Long = 0
val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
var bytes = dataStream.read(buffer)
while (bytes >= 0 && !isStopped) {
outPutStream.write(buffer, 0, bytes)
bytes = dataStream.read(buffer)
}
}
catch(ex){
print(ex) // Prints Socket exception "Broken pipe" if setChunkedStreamingMode is used
}
Исключение, возникающее при раскомментировании setChunkedStreamingMode
java.net.SocketOutputStream.socketWrite0(Native Method)
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116)
java.net.SocketOutputStream.write(SocketOutputStream.java:156)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.writeToSocket(ConscryptEngineSocket.java:762)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.writeInternal(ConscryptEngineSocket.java:736)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.write(ConscryptEngineSocket.java:699)
com.android.okhttp.okio.Okio$1.write(Okio.java:78)
com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:157)
com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
com.android.okhttp.okio.RealBufferedSink.write(RealBufferedSink.java:47)
com.android.okhttp.internal.http.Http1xStream$ChunkedSink.write(Http1xStream.java:327)
com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
com.android.okhttp.okio.RealBufferedSink$1.write(RealBufferedSink.java:199)
java.io.BufferedOutputStream.write(BufferedOutputStream.java:123)
myapp(upload.kt:558)
myapp.invokeSuspend(Unknown Source:14)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
Подробнее здесь: https://stackoverflow.com/questions/782 ... -exception
Почему установка «setChunkedStreamingMode» вызывает исключение Socket Exception? ⇐ Android
Форум для тех, кто программирует под Android
1711977957
Anonymous
Я пытаюсь загрузить файл на сервер с помощью HttpUrlConnection.
AFAIU, передавая размер буфера в setChunkedStreamingMode, позволяет избежать нехватки памяти при передаче больших файлов через HttpUrlConnection. Источник моего вывода
Ниже я предоставил сокращенную версию своего кода, которая работает, пока setChunkedStreamingMode комментируется. Но раскомментирование setChunkedStreamingMode вызывает «Исключение сокета. Сломанный канал»
Я не уверен, правильно ли я его использую. Может ли кто-нибудь помочь мне, подсказав, как использовать setChunkedStreamingMode
Код:
try{
val dataStream = applicationContext.contentResolver.openInputStream(Uri.parse(fileUri))
val url = URL(urlString)
val httpConnection = url.openConnection() as HttpURLConnection
for (i in keys.indices) {
httpConnection.setRequestProperty(keys[i], values[i])
}
httpConnection.requestMethod = "POST"
httpConnection.doOutput = true
// setting the chunked mode. Causing Socket exception.
// httpConnection.setChunkedStreamingMode(DEFAULT_BUFFER_SIZE * 2)
val outPutStream = BufferedOutputStream(httpConnection.outputStream)
var bytesCopied: Long = 0
val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
var bytes = dataStream.read(buffer)
while (bytes >= 0 && !isStopped) {
outPutStream.write(buffer, 0, bytes)
bytes = dataStream.read(buffer)
}
}
catch(ex){
print(ex) // Prints Socket exception "Broken pipe" if setChunkedStreamingMode is used
}
Исключение, возникающее при раскомментировании setChunkedStreamingMode
java.net.SocketOutputStream.socketWrite0(Native Method)
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116)
java.net.SocketOutputStream.write(SocketOutputStream.java:156)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.writeToSocket(ConscryptEngineSocket.java:762)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.writeInternal(ConscryptEngineSocket.java:736)
com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.write(ConscryptEngineSocket.java:699)
com.android.okhttp.okio.Okio$1.write(Okio.java:78)
com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:157)
com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
com.android.okhttp.okio.RealBufferedSink.write(RealBufferedSink.java:47)
com.android.okhttp.internal.http.Http1xStream$ChunkedSink.write(Http1xStream.java:327)
com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
com.android.okhttp.okio.RealBufferedSink$1.write(RealBufferedSink.java:199)
java.io.BufferedOutputStream.write(BufferedOutputStream.java:123)
myapp(upload.kt:558)
myapp.invokeSuspend(Unknown Source:14)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
Подробнее здесь: [url]https://stackoverflow.com/questions/78255744/why-setting-setchunkedstreamingmode-throws-socket-exception[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия