W przypadku Chrome 12.0.742.112 przekierowuję za pomocą następujących nagłówków:
HTTP/1.1 302 Found
Location: http://0.0.0.0:3000/files/download.zip
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
X-Ua-Compatible: IE=Edge
X-Runtime: 0.157964
Content-Length: 0
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 05 Jul 2011 18:42:25 GMT
Connection: Keep-Alive
Które, jeśli zastosowane, zwraca następujący nagłówek:
HTTP/1.1 200 OK
Last-Modified: Tue, 05 Jul 2011 18:18:30 GMT
Content-Type: application/zip
Content-Length: 150014
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 05 Jul 2011 18:44:47 GMT
Connection: Keep-Alive
Chrome nie przekieruje ani nie zmieni poprzedniej strony, po prostu zgłosi następujące ostrzeżenie w konsoli:
Zasób interpretowany jako dokument, ale przesłany za pomocą aplikacji / zip typu MIME.
Proces działa poprawnie w przeglądarce Firefox, a także działa poprawnie w przeglądarce Chrome, jeśli otworzę nową kartę i przejdę bezpośrednio do http://0.0.0.0:3000/files/download.zip
. Czy robię coś źle, czy jest to błąd / dziwactwo Chrome?
javascript
google-chrome
Ashley Williams
źródło
źródło
Odpowiedzi:
Możesz określić atrybut pobierania HTML5 w swoim tagu <a>.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download
źródło
W nagłówku żądania wysłano,
Content-Type: text/html
co oznacza, że chcesz zinterpretować odpowiedź jako HTML. Teraz, jeśli nawet serwer wysyła ci pliki PDF, twoja przeglądarka próbuje to zrozumieć jako HTML. To jest problem. Szukam, co może być przyczyną. :)źródło
Content-Type: application/zip
bezskutecznie, nadal próbuje przetworzyć go jako „dokument”. Prawdopodobnie warto również zauważyć, że zip zip jest dynamiczny w mojej aplikacji, więc nie ma to nic wspólnego z buforowaniem.Accept
nagłówek żądania jakotext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
? Jestem absolutnie zakłopotany, naprawdę!text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
jest część, która mówi, że Chrome akceptuje prawie wszystko (*/*
).Ten problem wystąpił podczas serwowania pliku PDF (aplikacja typu MIME / pdf) i rozwiązałem go, ustawiając nagłówek Content-Disposition, np .:
Mam nadzieję, że to pomaga.
źródło
Naprawiłem to… po prostu otwierając nową kartę.
Dlaczego nie działa, nie jestem do końca pewien, ale może mieć to coś wspólnego ze sposobem, w jaki Chrome radzi sobie z wieloma pobraniami na stronie, być może myślał, że to spam i po prostu je zignorował.
źródło
Nie mogłem znaleźć nigdzie samego wyjaśnienia wiadomości. Oto moja interpretacja.
O ile rozumiem, Chrome spodziewał się jakiegoś materiału, który mógłby wyświetlić ( dokument ), ale uzyskał coś, czego nie mógł wyświetlić (lub coś, o czym kazano go nie wyświetlać).
Jest to zarówno pytanie, w jaki sposób dokument został zadeklarowany na poziomie strony HTML w
href
(patrzdownload
atrybut w komunikacie Roya), jak i w jaki sposób jest zadeklarowany w odpowiedzi serwera za pomocą nagłówków HTTP (w szczególnościContent-Disposition
). Jest to kwestia kontraktu , w przeciwieństwie do nadziei i oczekiwań.Aby kontynuować drogę Evana, zauważyłem, że:
jest po prostu niezgodny z:
Chrome będzie płakać Zasób interpretowany jako dokument, ale przeniesiony…
W rzeczywistości dyspozycja załącznika oznacza po prostu: przeglądarka nie interpretuje linku, ale raczej przechowuje go gdzieś do innych - ukrytych - celów. Tutaj powyżej albo
download
brakujehref
, alboContent-disposition
trzeba je usunąć z nagłówków. Zależy to od tego, czy chcemy, aby przeglądarka renderowała dokument, czy nie.Mam nadzieję że to pomoże.
źródło
Ten sam problem napotkałem dzisiaj w wersji Chrome 30.0.1599.66 z moją aplikacją node.js / express.js.
Nagłówki są poprawne, wyrazić zestawy im właściwie automatycznie, to działa w innych przeglądarkach jak wskazano, oddanie html 5 „Pobierz” atrybut nie rozwiąże, co zrobił postanowienie to będzie w Chrome zaawansowanych ustawień i zaznaczając pole „Pytaj, gdzie zapisać każdy plik przed pobraniem ".
Po tym nie zgłoszono błędu „Zasób interpretowany jako dokument ....” jak w tytule tego problemu, więc wygląda na to, że kod naszego serwera jest poprawny, to Chrome nieprawidłowo zgłasza ten błąd w konsoli, gdy jest ustawiony na zapis pliki do lokalizacji automatycznie.
źródło
Miałem podobny problem podczas pobierania pliku przez Javascript. Dodanie atrybutu pobierania nie miało znaczenia, ale dodanie celu = „_ puste” - nie wyświetla się komunikat konsoli „Zasób interpretowany jako dokument ...”.
Oto mój bardzo prosty kod:
Nie próbowałem tego z bezpośrednim HTML, ale spodziewam się, że zadziała.
Uwaga: Odkryłem, że Firefox wymaga dołączenia linku do dokumentu, podczas gdy Chrome będzie bez niego działał.
źródło
Zetknąłem się z tym, gdy przypisałem src = "image_url" w ramce iframe. Wygląda na to, że iframe interpretuje go jako dokument, ale tak nie jest. Dlatego wyświetla ostrzeżenie.
źródło
var photoData = new FormData();
a następnie ustawiłem właściwośćcontentType: false
w moim żądaniu ajax. Żądanie posta będzie:Content-Disposition: form-data;
I typ treściContent-Type: text/html
Rozwiązałem problem przez
adding target="_blank"
link. Dzięki temu chrome otwiera nową kartę i ładuje plik PDF bez ostrzeżenia, nawet w trybie responsywnym.źródło
window.open(href, '_blank');
a nowa karta automatycznie zamyka się po pobraniu.Miałem ten problem w projekcie strony internetowej ASP. Dodanie nagłówka „Content-Length” spowodowało, że pobieranie ponownie zaczęło działać w Chrome.
źródło
Ten problem pojawił się ponownie w wersji Chrome 61. Ale wygląda na to, że jest naprawiony w Chrome 62.
Mam RewriteRule jak poniżej
W przypadku Chrome 61 plik PDF nie otwierał się, w konsoli wyświetlał komunikat
Próbowaliśmy dodać typ MIME do reguły przepisywania jak poniżej, ale to nie pomogło.
Zaktualizowałem Chrome do najnowszej wersji 62 i znów zaczął wyświetlać plik PDF. Ale wiadomość jest nadal w konsoli.
We wszystkich innych przeglądarkach działało / działa dobrze.
źródło
Po prostu wpadłem na to i żadna inna informacja, na którą mogłem znaleźć, nie pomogła: to był głupi błąd: wysyłałem dane wyjściowe do przeglądarki przed rozpoczęciem pobierania pliku. Co zaskakujące, nie znalazłem żadnych pomocnych błędów (takich jak „nagłówki już wysłane” itp.). Mam nadzieję, że to uratuje kogoś innego!
źródło
W moim przypadku nazwa pliku była za długa i wystąpił ten sam błąd. Po skróceniu poniżej 200 znaków działało dobrze. (limit może wynosić 250?)
źródło
Wystąpił ten błąd, ponieważ serwowałem z mojego systemu plików. Kiedyś zacząłem od serwera HTTP, chrom mógł to rozgryźć.
źródło
Te same problemy mam z utworzonym przeze mnie menedżerem pobierania. Problem polegał na tym, że nazwa pliku była zbyt długa i rozszerzenie zostało obcięte.
Przykład: Nazwa pliku: Protokoły organizacyjne i inne ważne rzeczy.pd
Rozwiązanie: Zwiększono pole bazy danych MySQL do 255, aby zapisać nazwę pliku, i wykonano kontrolę długości przed zapisaniem obiektu blob. Jeśli długość> 255 przytnij ją do 250 i dodaj rozszerzenie pliku.
źródło
Wypróbuj poniższy kod i mam nadzieję, że to zadziała.
źródło
Zmierzyłem się z tym dzisiaj, a moim problemem było to, że mój
Content-Disposition
tag był źle ustawiony. Wygląda na obapdf
iapplication/x-zip-compressed
powinieneś to ustawićinline
zamiastattachment
.Aby ustawić nagłówek, kod Java wyglądałby tak:
źródło