Mam aplikację internetową, która pozwala użytkownikom pobrać plik PDF. Jest to ASP.NET MVC i wszystko działa dobrze w przeglądarkach komputerowych, iPhone'ach, urządzeniach z Androidem Chrome i natywnej aplikacji na Androida, która zastępuje widok Web set setDownloadListener().Przeglądarka systemu Android nie pobierze pliku PDF
Jednak pobieranie nie działa, gdy używana jest domyślna przeglądarka systemu Android. Testuję na Galaxy Nexusie z 4.2.2 i na Nexusie S 4g z 2.3.7. Mam zainstalowane aplikacje przeglądarek PDF na obu urządzeniach.
Kiedy testuję w Androidzie Chrome, użytkownik zobaczy toast "Rozpoczęcie pobierania ...", a na pasku stanu zostanie wyświetlone powiadomienie o zakończeniu pobierania. Użytkownik może dotknąć tego powiadomienia, aby otworzyć plik w przeglądarce plików pdf. W domyślnej przeglądarce Androida nie ma tosty i nie zapisano żadnego pliku do pobrania.
kładę Wireshark w sieci i widzę następującą prośbę:
GET /appapth/ViewPDF/8383600280757433_11_05_2012 HTTP/1.1
Host: 192.168.1.117
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
X-Requested-With: com.google.android.browser
User-Agent: Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Galaxy Nexus Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Accept-Encoding: gzip,deflate
Accept-Language: en-US
Accept-Charset: utf-8, iso-8859-1, utf-16, *;q=0.7
Cookie: (lots o'cookie data)
a odpowiedź brzmi:
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: application/pdf
Content-Encoding: gzip
Expires: -1
Server: Microsoft-IIS/7.5
Set-Cookie: ___TempData=; path=/
Set-Cookie: ___TempData=(lot's o'cookie data); path=/; HttpOnly
Date: Mon, 01 Apr 2013 18:22:20 GMT
Content-Length: 48244
......YQ.....T...?J.h)...!E.S(lots o'binary data)
Jak widać z treści aplikacji ślad/PDF jest pobierany. Widać też, że nie używam nagłówka treści, a odpowiedź jest pobierana z kodowaniem gzip.
Jakieś pomysły na to, dlaczego to nie działa w domyślnej przeglądarce Androida? Użytkownik nie ma dostępu do pobranych danych i nie uruchomiono żadnej przeglądarki (ani intencji). Odpowiedź jest po cichu ignorowana. (Zgaduję, że domyślna przeglądarka Android wymaga Content-Disposition lub nie lubi Gzip na pobraniu, ale jestem po prostu zgadywania)
Aktualizacja ----
usunąłem naszą filtr działania, który implementowałem kompresję Gzip i dodałem w nagłówku załącznika do dyspozycji treści . tak, kod MVC w moim kontroler jest jak:
public virtual ActionResult ViewPDF(string id)
{
try
{
byte[] pdf = GetPDFContent(id);
FileContentResult fcr = new FileContentResult(pdf, "application/pdf");
fcr.FileDownloadName = id + ".pdf";
return fcr;
}
i odpowiedzi HTTP jest teraz:
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: application/pdf
Expires: -1
Server: Microsoft-IIS/7.5
Content-Disposition: attachment; filename=433_07_05_2012.pdf
Set-Cookie: ___TempData=; path=/
Set-Cookie: ___TempData=(lots o'cookie data);path=/; HttpOnly
Date: Mon, 01 Apr 2013 19:56:07 GMT
Content-Length: 59069
%PDF-1.3 %.... 13 0 obj << (lots o'binary pdf data)
Nie ma już gzip i nie ma treści usposobienie, ale na Android domyślnie przeglądarka nadal nie jest widoczna do pobrania.
Aktualizacja 2 ---
próbował propozycje od https://stackoverflow.com/a/5728859/90236 i http://winzter143.blogspot.com/2012/03/android-handling-of-content-disposition.html i http://androidforums.com/application-development/256987-android-phone-download-issue-asp-net-website.html ale wciąż uzyskać takie same wyniki.
mam ten sam problem. Przeglądarka Android i przeglądarka Dolphin nie są pobierane. Nie ma problemu w innych przeglądarkach.Próbowałem wszystkich sugestii, które też łączyłeś. –
Znaleźliśmy odpowiedź. Mam nadzieję, że Ci to pomoże. Pobierałem w iFrame, a przeglądarka Android nie wydawała się to lubić. Dodaj target = "_ blank" do i teraz działa. –
Niestety nie dotyczy to mnie - inicjuję pobieranie przez formularz postu do akcji kontrolera, która zwraca obiekt FileStreamResult. –