Zasób interpretowany jako dokument, ale przesłany za pomocą aplikacji / zip typu MIME

199

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?

Ashley Williams
źródło

Odpowiedzi:

168

Możesz określić atrybut pobierania HTML5 w swoim tagu <a>.

<a href="http://example.com/archive.zip" download>Export</a>

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download

Roy Hyunjin Han
źródło
3
Atrybut „pobierz” nie jest obsługiwany w ie lub w innej przeglądarce. jeśli masz inne opcje, pomóż mi
Renish Khunt,
3
To naprawia Chrome, ale psuje inne przeglądarki. Moje telefony z Androidem nie będą pobierać z tego rodzaju łącza.
Betty
38
westchnienie. TO „POPRAWKA” NIE DZIAŁA DLA NAJBARDZIEJ PRZEGLĄDAREK - tylko Chrome. I jest rok 2016, więc nie spodziewaj się, że wkrótce.
a20
2
Nie robi różnicy w Chrome 2019
Michael Rogers
16
@all Jest rok 2035 (przyszedłem z przyszłości) i nie ma komputera, który by to obsługiwał.
Ali Farhoudi
34

W nagłówku żądania wysłano, Content-Type: text/htmlco 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ą. :)

Saeed Neamati
źródło
Próbowałem wysłać go Content-Type: application/zipbezskutecznie, 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.
Ashley Williams,
1
Dzięki! Czy może to mieć coś wspólnego z Chrome wysyłającym Acceptnagłówek żądania jako text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8? Jestem absolutnie zakłopotany, naprawdę!
Ashley Williams,
5
Nie, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8jest część, która mówi, że Chrome akceptuje prawie wszystko ( */*).
Saeed Neamati,
3
O czym mówisz? W pytaniu nie ma nagłówka żądania. Oba są nagłówkami odpowiedzi.
doubleDown,
1
Siedzę tutaj i zastanawiam się, dlaczego to powinna być odpowiedź, a nie komentarz?
deska rozdzielcza
24

Ten problem wystąpił podczas serwowania pliku PDF (aplikacja typu MIME / pdf) i rozwiązałem go, ustawiając nagłówek Content-Disposition, np .:

Content-Disposition: attachment; filename=foo.pdf

Mam nadzieję, że to pomaga.

Evan
źródło
11
ale gdzie to napisać?
hud
4
@coder Dodajesz takie nagłówki z serwera. Nie jestem pewien, czego używasz, więc trudno jest podać więcej informacji. Jakiego języka lub struktury używasz na swoim serwerze?
Evan
7
Miej to w nagłówkach, ale Chrome nadal wyświetla ostrzeżenie
Adam Reis
nie, to nie naprawia niczego na chrome Wersja 76.0.3809.132 (oficjalna wersja ) (64-bit) Mam już dołączone nagłówki
Muhammad Omer Aslam
22

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

Ashley Williams
źródło
6
Co masz na myśli mówiąc, że „otworzyłeś nową kartę” ??? Ręcznie otworzyłeś nowe okno przeglądarki i wkleiłeś tam adres URL pobierania?
Tony R
2
Tak, dokładnie. Zakładałem, że był to błąd w stanie aplikacji określonej karty.
Ashley Williams
52
Nie spodziewałbym się, że użytkownik otworzy nową kartę ... I nie uważam też, aby otwarcie karty było eleganckie.
Yassir Ennazk,
24
@Joram i in. glin. - otwarcie zakładki do pobrania (użycie docelowego „_blank”) - nie rozwiązuje problemu, po prostu przenosi komunikat ostrzegawczy konsoli „Zasób zinterpretowany jako dokument” do nowej karty. Zamiatanie pod dywan nie jest rozwiązaniem.
colm.anseo
1
To oczywiście nie rozwiązuje oryginalnej odpowiedzi. Poważnie ... Co bym wstawił do dokumentu użytkownika „skopiuj adres URL, otwórz nową kartę, wklej adres URL ...”? Biznes w dół.
Stranded Kid
22

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(patrz downloadatrybut w komunikacie Roya), jak i w jaki sposób jest zadeklarowany w odpowiedzi serwera za pomocą nagłówków HTTP (w szczególności Content-Disposition). Jest to kwestia kontraktu , w przeciwieństwie do nadziei i oczekiwań.

Aby kontynuować drogę Evana, zauważyłem, że:

Content-type: application/pdf
Content-disposition: attachment; filename=some.pdf

jest po prostu niezgodny z:

<a href='some.pdf'>

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 downloadbrakuje href, albo Content-dispositiontrzeba 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.

Champignac
źródło
9

Ten sam problem napotkałem dzisiaj w wersji Chrome 30.0.1599.66 z moją aplikacją node.js / express.js.

Nagłówki 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.

JohnC
źródło
9

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:

var link = document.createElement('a');
link.target = '_blank';
link.href = url;
document.body.appendChild(link); // Required for Firefox
link.click();
link.remove(); 

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

Elliveny
źródło
4
tylko ostrzeżenie, cel = „_blank” uruchomi mechanizm zapobiegania wyskakującym
oknom
4

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.

Carmela
źródło
czy możesz mi powiedzieć, jak to naprawiłeś? ponieważ
mam
Użyłem danych formularza: var photoData = new FormData(); a następnie ustawiłem właściwość contentType: falsew moim żądaniu ajax. Żądanie posta będzie: Content-Disposition: form-data;I typ treściContent-Type: text/html
Carmela
3

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.

med
źródło
Zrobiłem to i zadziałało: window.open(href, '_blank');a nowa karta automatycznie zamyka się po pobraniu.
Chad Richardson
1

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. Salisbury
źródło
1

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

RewriteRule ^/ShowGuide/?$ https://<website>/help.pdf [L,NC,R,QSA]

W przypadku Chrome 61 plik PDF nie otwierał się, w konsoli wyświetlał komunikat

"Resource interpreted as Document but transferred with MIME type application/pdf: "

Próbowaliśmy dodać typ MIME do reguły przepisywania jak poniżej, ale to nie pomogło.

RewriteRule ^/ShowGuide/?$ https://<website>/help.pdf [L,NC,R,QSA, t:application/pdf]

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.

Asif Nowaj
źródło
1

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!

użytkownik6096790
źródło
0

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?)

holdfenytolvaj
źródło
0

Wystąpił ten błąd, ponieważ serwowałem z mojego systemu plików. Kiedyś zacząłem od serwera HTTP, chrom mógł to rozgryźć.

remydib
źródło
0

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

<?php
  header("Content-Disposition: attachment; filename=$File_Name");
?>

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.

eradima
źródło
0

Wypróbuj poniższy kod i mam nadzieję, że to zadziała.

var Interval = setInterval(function () {
                if (ReportViewer) {
                    ReportViewer.prototype.PrintReport = function () {
                        switch (this.defaultPrintFormat) {
                            case "Default":
                                this.DefaultPrint();
                                break;
                            case "PDF":
                                this.PrintAs("PDF");
                                previewFrame = document.getElementById(this.previewFrameID);
                                previewFrame.onload = function () { previewFrame.contentDocument.execCommand("print", true, null); }
                                break;
                        }
                    };
                    clearInterval(Interval);
                }
            }, 1000);
Faraz
źródło
0

Zmierzyłem się z tym dzisiaj, a moim problemem było to, że mój Content-Dispositiontag był źle ustawiony. Wygląda na oba pdfi application/x-zip-compressedpowinieneś to ustawić inlinezamiast attachment.

Aby ustawić nagłówek, kod Java wyglądałby tak:

...
String fileName = "myFileName.zip";
String contentDisposition = "attachment";
if ("application/pdf".equals(contentType)
    || "application/x-zip-compressed".equals(contentType)) {
    contentDisposition = "inline";
}
response.addHeader("Content-Disposition", contentDisposition + "; filename=\"" + fileName + "\"");
...
Olivier B.
źródło