Android браузер / ошибка веб-просмотра?Содержание-Диспозиция: вложение;имя файла = "xyz.txt" - PullRequest
2 голосов
/ 22 октября 2010

Таким образом, Android-браузер или веб-браузер прекрасно работают с такими URL-адресами - abc.com/xyz.txt

Однако, если ваш URL-адрес выглядит так - abc.com/xyz.php и что отправленобраузер в заголовках - Content-Disposition: вложение;filename = "xyz.txt", тогда браузеры Android и веб-представление кажутся ужасно запутанными.

Похоже, что оно сохраняет правильное имя файла на телефоне, но содержимое заполнено веб-страницей, которая быларанее просматривался.Это прекрасно работает в браузерах на базе ПК, iPhone и Blackberry, это проблема только для Android 2.1 и 2.2 (другие не тестировали).

У кого-нибудь есть решение?Буду очень признателен.Я действительно не хочу начинать хранить статические файлы и хочу сгенерировать загружаемый контент на лету.Журнал на телефоне не выявил никаких улик.


Вот что сервер отправляет в браузер

===================== start content ====================================
HTTP/1.1 200 OK
Date: Thu, 21 Oct 2010 21:22:11 GMT
Server: Apache
Content-Disposition: attachment; filename="Wafty.txt"
Content-length: 30
Content-Type: text/plain; charset=ISO-8859-1

Hello this is a test of a file
========= There was no carriage return at the end of the above line ====

Ответы [ 2 ]

1 голос
/ 02 октября 2014

У меня есть проблема, похожая на вашу.Проблема здесь в том, как WebView обрабатывает вложения (настоящая боль в заднице).Когда WebView посещает веб-страницу, которая в какой-то момент возвращает вложение, он говорит что-то вроде: «О, дерьмо, что я могу сделать с этой не-HTML штукой? ... Эй, вы! DownloadListener!какая-то ерунда о вложении ".Итак, DownloadListener вступает во владение, и здесь возникает проблема: он снова запрашивает тот же URL-адрес для загрузки вложения, поэтому для загрузки вложения при посещении страницы WebView выполняет 2 запроса: сама страница, а затем еще один, чтобы загрузитьвложение, а не просто скачать его.

А как это проблема?Хорошо, допустим, что в вашем abc.com/xyz.php есть какая-то логика вроде:

<?php
   if(User::loggedIn()) {
       header("Content-Disposition: attachment...");
       //Some more logic for the download
   }
?>

Второй запрос, выполняемый DownloadListener, сделает еще один запрос к abc.com/xyz.php, но этоесли он не будет содержать файлы cookie или информацию о сеансе, поэтому он не будет входить в логику загрузки.

Возможным решением будет перенаправление во временную копию или реальный путь к файлу, который не содержитсодержит любую логику, поэтому нет проблем.Конечно, вам также нужно определить прослушиватель Download с помощью WebView, например, вот так.

webView.setDownloadListener(new DownloadListener() {

    @Override
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {

        final DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        Request request = new DownloadManager.Request(Uri.parse(url));
        request.setMimeType(mimeType);

        //Persist download notification in the status bar after the download completes (Android 3.0+)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        }

        dm.enqueue(request);
    }

});
1 голос
/ 29 августа 2011

использование

Content-Disposition: attachment;filename="xyz.txt"

не использовать

Content-Disposition: attachment;  filename="xyz.txt"
...