Unikanie problemów z typem zawartości podczas pobierania pliku za pośrednictwem przeglądarki na Androida

Jeśli mam plik udostępniony przeglądarce za pośrednictwem mojej aplikacji webapp, Zwykle ustawiam adres URL na coś w rodzaju http://website.com/webapp/download/89347/image.jpg. Następnie ustawiam nagłówki HTTP Content-Type: application/octet-stream; filename=image.jpg i Content-Disposition: Attachment.

Jednak na Androidzie. Wydaje się, że jedynym sposobem na pobranie pliku jest ustawienie Content-Type: image/jpg. W przeciwnym razie nazwa pliku mówi <Unknown> i pojawia się błąd

Pobierz nieudane
Nie można pobrać. Zawartość nie jest obsługiwana w tym telefonie

Czy Jest jakiś sposób, aby uzyskać Android, aby pobrać i otworzyć plik przez przeglądarkę bez utrzymywania listy typów mime?

Author: George Bailey, 2011-01-13

5 answers

Aby pliki do pobrania działały zgodnie z oczekiwaniami we wszystkich (a zwłaszcza starszych) wersjach Androida, musisz...

  1. Ustaw ContentType na application / octet-stream
  2. Umieść wartość nazwy pliku Content-Disposition w podwójnych cudzysłowach
  3. Zapisz rozszerzenie nazwy pliku Content-Disposition wielkimi literami

Przeczytaj mój wpis na blogu po więcej szczegółów:
http://digiblog.de/2011/04/19/android-and-the-download-file-headers/

 24
Author: Jpsy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 11:28:18

Dmitriy (lub inni szukający możliwego rozwiązania) jeśli w pobranym pliku pojawia się strona html, podejrzewam, że jest to spowodowane podwójnym problemem HttpRequest GET. Typowy scenariusz to następujący model POST, Redirect, GET:

  • Przeglądarka Android wysyła wiadomość HttpRequest do serwera (np. przycisk Wyślij lub link do żądania pobrania pliku, nazwę pliku.ext say)

  • Serwer strumieniuje żądaną nazwę pliku.ext do bajtów, przechowuje w zmiennej sesyjnej, a następnie wydaje odpowiedź.Przekierowanie do pobrania.aspx, na przykład, do obsługi budowy obiektu odpowiedzi

  • Przeglądarka Android poprawnie wysyła HttpRequest GET do serwera do pobrania.aspx

  • Serwer odpowiada typową treścią-Disposition:attachment; filename= " nazwa pliku.ext " konstrukcja stylu z obiektem response zawierającym żądaną nazwę pliku.ext, będące bajtami w zmiennej sesyjnej.

  • Android download manager, jak sądzę, następnie wysyła kolejny HttpRequest dostać się do serwera do pobrania.aspx. Podejrzewam, że menedżer pobierania interpretuje poprzednią odpowiedź "załącznik" jako wyzwalacz do wysłania tego drugiego GET.

  • Serwer (Pobierz.aspx) ponownie próbuje skonstruować obiekt odpowiedzi, aby odesłać go z powrotem do przeglądarki.

  • Android download manager pobiera nazwę pliku.ext, używając zawartości obiektu response z drugiego pobrania.aspx.

W wielu scenariuszach byłoby to w porządku. Ale jeśli, dla przykład, serwer w Download.kod aspx wykonuje pewne porządkowanie i usuwa zmienną sesyjną przy pierwszym wywołaniu, a następnym razem nie ma zmiennej sesyjnej. Tak więc, w zależności od tego, jak kod jest napisany, możliwe jest, że obiekt odpowiedzi nie zostanie skonstruowany, a może odpowiedź.Koniec nie jest wywoływany, a więc tylko pobieranie.HTML aspx kończy się wysyłaniem.

To właśnie odkryliśmy używając Wireshark, choć przyznaję, że zakładam, że jest menedżer pobierania Androida, który jest przyczyną podwójnego uzyskania.

Mam nadzieję, że to wyjaśnienie było pomocne.

 10
Author: StevePayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-20 17:07:59

Jak pisałem w Pobieranie plików z Androida:

Przeglądarka Android nie pobierze pliku w zdarzeniach Post button. W zdarzeniach post plik będzie trochę .plik śmieci htm. aby to zrobić, jak poniżej.

W przycisku Pobierz Kliknij

 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.
 2
Author: Martin K Abraham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-25 08:07:20

Wypróbowałem wszystkie rekomendacje z bloga Jspy i do tej pory nic nie działało. Content-disposition wprowadza przeglądarkę w tryb pobierania, jednak nic nie jest pobierane z wyjątkiem HTML strony, z której pobieranie zostało zainicjowane. Więc mój wniosek, to jest czysty błąd z Google i możemy tylko modlić się o to, że Google go naprawić. Moja praca polegała na ustawieniu typu treści na jakiś typ pochodzący z nagłówka Akceptuj formularz mobilnej przeglądarki. Ogólnie działa, można nawet pobrać pliki zip jako tekst.

 0
Author: Dmitriy R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-17 01:21:06

Teoretycznie parametr filename powinien być ustawiony na Content-Disposition, a nie Content-Type. Nie jestem pewien, czy pomoże to w przeglądarce Android.

 0
Author: Julian Reschke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-20 18:06:59