Потоковая передача байтов с контроллера, браузера Android, загрузка не удалась - PullRequest
0 голосов
/ 09 ноября 2011

Grails 1.3.7

У меня есть некоторый код, который выглядит следующим образом ...

response.setHeader("Content-disposition", "attachment; filename=${fileName}")
response.contentType = download.contentType
response.contentLength = file.length()
response.outputStream << file.getBytes()

На рабочем столе и на iPad загрузка работает просто отлично.Но на устройствах Android это просто дает мне «Неизвестный myserver.com В процессе».И тогда в конечном итоге не удается.Пара моментов ...

  • Это происходит локально, на стадии установки и на производственных серверах
  • Тестирование без SSL, все работает нормально.
  • Когда я пытаюсьзагрузка в браузере Dolphin Я получаю те же результаты с добавленным битом текста «Ожидание подключения к данным»

Обновление № 2: отслеживание стека, которое происходит только при загрузке с Androidустройство:

Stacktrace follows:
java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at com.sun.net.ssl.internal.ssl.OutputRecord.writeBuffer(OutputRecord.java:297)
    at com.sun.net.ssl.internal.ssl.OutputRecord.write(OutputRecord.java:286)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:743)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:731)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
    at com.wbr.consumer.ProductController$_closure1_closure2.doCall(ProductController.groovy:30)
    at com.wbr.consumer.ProductController$_closure1.doCall(ProductController.groovy:28)
    at com.wbr.consumer.ProductController$_closure1.doCall(ProductController.groovy)
    at java.lang.Thread.run(Thread.java:680)

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Я понимаю, что это на несколько месяцев позже, но я также столкнулся с этой проблемой с браузером Android и приложением Grails, над которым я работал.

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

http://code.google.com/p/android/issues/detail?id=1978

http://code.google.com/p/android/issues/detail?id=18462

Я получил два запроса на стороне сервера для загружаемого файла;один из браузера и один из менеджера загрузки.Тот из браузера заканчивается, и сокет закрывается, как только браузер определяет, что это загружаемый контент.Затем браузер передает загрузку диспетчеру загрузки.

У меня также были проблемы с загрузкой, которая не удалась из диспетчера загрузки, но из-за этого я не отправлял заголовки, как только они были готовы.Я столкнулся с этим только с большими APK, маленькие APK (до 10-20K), казалось, загружались просто отлично.

Некоторый код может помочь:

    response.contentType = 'application/vnd.android.package-archive'
    response.addHeader('Content-Disposition', 'attachment; filename=FILENAME.APK')

    // output file content
    response.setStatus(200)
    response.setContentLength("CONTENTSIZE")

    // send headers
    response.flushBuffer()

    try {
        response.outputStream << {FILE}.getBytes()
        response.outputStream.flush()
    } catch (SocketException e) {
        log.error(e)
    }
    return

С этим я всегда получаюза исключением одного сокета.Не знаю, можно ли этого избежать, из какого-то быстрого поиска я не нашел способа определить состояние сокета по сервлету без простой попытки записи в сокет.

0 голосов
/ 09 ноября 2011

Похоже, что есть потенциально 2 проблемы

  1. используемый вами браузер не доверяет самоподписанному сертификату.

    • Работают ли другие сайты SSL из этого браузера?
    • Можете ли вы установить свой STG сертификат в хранилище доверенных сертификатов браузера?
    • Глупый вопрос: вы правильно указали URL запроса? https против http ... я знаю, что это глупо .....
  2. ответ никогда не сбрасывается на клиента. Попробуйте это:

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