Избежание проблем с типом контента при загрузке файла через браузер на Android
если у меня есть файл, доступный для браузера через мой webapp, я обычно просто устанавливаю URL-адрес на что-то вроде http://website.com/webapp/download/89347/image.jpg
. Затем я устанавливаю HTTP-заголовки Content-Type: application/octet-stream; filename=image.jpg
и Content-Disposition: Attachment
.
однако, на Android. Кажется, единственный способ загрузить файл-установить Content-Type: image/jpg
. В противном случае имя файла говорит <Unknown>
и приходит ошибка
скачать неудачные
Не удается загрузить. Содержимое не поддерживается на этом телефон
есть ли способ заставить Android загрузить и открыть файл через браузер, не сохраняя список типов mime?
5 ответов
чтобы любые загрузки работали на всех (и особенно старых) версиях Android, как ожидалось, вам нужно...
- установите ContentType в application / octet-stream
- поместите значение имени файла Content-Disposition в двойные кавычки
- напишите расширение имени файла Content-Disposition в верхнем регистре
Подробнее читайте в моем блоге details:
http://digiblog.de/2011/04/19/android-and-the-download-file-headers/
Дмитрий (или другие, ищущие возможное решение) если в загруженном файле появляется html-страница, я подозреваю, что это связано с двойной проблемой HttpRequest GET. Типичным сценарием является следующий POST, Redirect, GET model:
браузер Android выдает сообщение HttpRequest на сервер (например, кнопка отправки или ссылка для запроса файла загрузки, имя файла.ext say)
сервер передает запрошенное имя файла.ext в байты, магазины в a переменная сеанса, а затем выдает ответ.Перенаправление для загрузки.aspx, например, для обработки конструкции объекта ответа
браузер Android правильно отправляет HttpRequest GET на сервер для загрузки.аспн
сервер отвечает типичным Content-Disposition: attachment; filename= " filename.конструкция стиля " ext " с объектом ответа, содержащим запрошенное имя файла.ext, будучи байтами в сеансе переменная.
Android download manager, я считаю, затем отправляет еще один HttpRequest GET на сервер для загрузки.аспн. Я подозреваю, что менеджер загрузки интерпретирует предыдущий ответ "вложение" как триггер для отправки этого второго GET.
Сервер (Скачать.aspx) снова пытается создать объект ответа для отправки обратно в браузер.
Android download manager загружает имя файла.ext, используя ответ содержимое объекта из второй загрузки.аспн.
во многих сценариях это было бы хорошо. Но если, например, сервер в Скачать.код aspx выполняет некоторую уборку и удаляет переменную сеанса при первом вызове, а затем в следующий раз нет переменной сеанса. Таким образом, в зависимости от того, как написан код, возможно, что объект ответа не получает построенной эксплицитности и, возможно, ответа.Конец не называется, и поэтому только Скачать.html aspx в конечном итоге отправляется.
Это то, что мы обнаружили с помощью Wireshark, хотя я признаю, что я предполагаю, что это менеджер загрузки Android, который является причиной двойного GET.
Я надеюсь, что это объяснение помогло.
Как я писал в загрузка файлов с android:
Android браузер не будет загружать файл в кнопке Post событий. В post events файл будет некоторым .файл мусора 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-файлы в виде текста.
теоретически параметр filename должен быть установлен на Content-Disposition, а не Content-Type. Не уверен, поможет ли это с браузером Android.