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?


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


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ą. :)


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.


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


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.


9

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.


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


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.


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.


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.


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.


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!


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


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źć.


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.


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

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 + "\"");
...
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.