Как избежать проблем с типом контента при загрузке файла через браузер на Android
Если у меня есть файл, доступный браузеру через мое веб-приложение, я обычно просто устанавливаю URL-адрес на что-то вроде http://website.com/webapp/download/89347/image.jpg
. Затем я устанавливаю заголовки HTTP Content-Type: application/octet-stream; filename=image.jpg
и Content-Disposition: Attachment
.
Однако, на Андроиде. Похоже, единственный способ, которым я могу загрузить файл, - это установить Content-Type: image/jpg
. В противном случае имя файла говорит <Unknown>
и появляется Ошибка
Есть ли какой-нибудь способ, которым я могу получить Android, чтобы загрузить и открыть файл через браузер, не сохраняя список типов mime?Скачать неудачно
Не удается загрузить. Содержание не поддерживается на этом телефоне
5 ответов:
Чтобы любые загрузки работали на всех (и особенно более старых) версиях Android, как и ожидалось, вам нужно...
- Установите ContentType в application / octet-stream
- Поместите значение файла Content-Disposition в двойные кавычки
- напишите расширение файла Content-Disposition в верхнем регистре
Прочитайте мой пост в блоге для получения более подробной информации:
http://digiblog.de/2011/04/19/android-and-the-download-file-headers/
Дмитрий (или другие, ищущие возможное решение)если в загруженном файле появляется html-страница, я подозреваю, что это связано с проблемой double HttpRequest GET. Типичным сценарием является следующая модель POST, Redirect, GET:
Браузер Android выдает сообщение HttpRequest на сервер (например, кнопка отправки или ссылка для запроса файла загрузки, имя файла.ext say)
Сервер передает запрошенное имя файла.ext в байтах, сохраняет в переменной сеанса, а затем выдает ответ.Перенаправление для загрузки.aspx, например, для обработки конструкции объекта ответа
Браузер Android корректно отправляет HttpRequest GET на сервер для загрузки.aspx
Сервер отвечает типичным расположением содержимого: attachment; filename= " filename.конструкция стиля ext " с объектом ответа, содержащим запрошенное имя файла.ext, будучи байтами в переменной сеанса.
Android download manager, я полагаю, затем отправляет еще один HttpRequest получить на сервер для загрузки.аспн. Я подозреваю, что менеджер загрузок интерпретирует предыдущий ответ "attachment" как триггер для отправки этого второго GET.
Сервер (Скачать.aspx) снова пытается построить объект ответа для отправки обратно в браузер.
Менеджер загрузок Android загружает имя файла.ext, используя содержимое объекта ответа из второй загрузки.аспн.
Во многих сценариях это было бы прекрасно. Но если, например пример, сервер в загрузке.код aspx выполняет некоторую домашнюю работу и удаляет переменную сеанса при первом ее вызове, а затем в следующий раз нет переменной сеанса. Таким образом, в зависимости от того, как написан код, возможно, что объект ответа не получает построенную эксплицитность и, возможно, ответ.Конец не вызывается, и поэтому только загрузка.html aspx в конечном итоге отправляется.
Это то, что мы обнаружили с помощью Wireshark, хотя я допускаю, что это так менеджер загрузок Android, который является причиной двойного GET.
Я надеюсь, что это объяснение принесло некоторую пользу.
Как я писал в Загрузка файлов с android :
Браузер Android не будет загружать файл в кнопке Post events. В post-событиях файл будет несколько .htm мусорный файл. чтобы преодолеть это, сделайте, как показано ниже.
В кнопке Загрузить нажмите
protected void ImageButton1_Click(object sender, ImageClickEventArgs e) { Response.Redirect("download-file.aspx"); } and on download-file.aspx file do as below using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class mobile_download_file : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string filename = "usermanual.pdf"; Response.ContentType = "application/octet-stream"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + "" + filename + ""); Response.Write(Server.MapPath(Request.ApplicationPath) + "\\" + filename); Response.TransmitFile(Server.MapPath(Request.ApplicationPath) + "\\" + filename); Response.End(); } } the same can be implemented in php also.
Я перепробовал все рекомендации из блога Jspy, и до сих пор ничего не работало. Content-disposition переводит браузер в режим загрузки, однако ничего не загружается, кроме HTML страницы, с которой была инициирована загрузка. Итак, мой вывод: это чистый баг от Google, и мы можем только молиться, чтобы Google исправил его. Моя работа заключалась в том, чтобы установить тип контента на некоторый тип, поступающий из мобильного браузера Accept header form. Как правило, это работает, вы даже можете скачать zip-файлы в виде текста.