2013-04-01 13 views
6

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.

+0

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ś. –

+0

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. –

+0

Niestety nie dotyczy to mnie - inicjuję pobieranie przez formularz postu do akcji kontrolera, która zwraca obiekt FileStreamResult. –

Odpowiedz

Powiązane problemy