Content-Disposition: inline/attachment a IE

Snažím se PHP skriptem načítat různé soubory, které chci aby se uživateli zobrazily pod jiným názvem, než jsou umístěny na serveru. Pokud použiji následující kód, pak se v IE sice načte excelovská tabulka, ale vždy pod názvem php skriptu, který tento soubor otevírá. Novynazev.xls je prostě ignorován. Pokud použiji Content-Disposition: attachment, pak je vše v pořádku, ale před otevřením souboru vždy vyskočí dialogové okno s tím, zda chci soubor otevřít/uložit, což je zase pro mě nežádoucí. Podařilo se někomu vyřešit tento problém? Volba jiného prohlížeče samozřejmě není řešením.


Úkazka kódu v PHP pro xls soubor:

header("Content-Type: application/vnd.ms-excel; charset=windows-1250");
header("Content-Disposition: inline; filename=\"novynazev.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
fclose($fh);
<HTML>Co je špatného na volbě otevřít/uložit? Attachment je to jediné správné řešení - jakmile IE vidí, že je to soubor, nabízí jej otevřít/uložit. To je chování IE, tedy něco, co neovlivníte.</HTML>
A ten název chceš aby byl v adresním řádku? Pak použij nějaké přesměrování, v tvém případě bude asi nejlepším klíčovým výrazem pro vyhledávání: htaccess mod rewrite
Toto je standardní chování content-disposition: attachment. Nevím, co se ti zdá divné.

Chápu to stejně jako R.U.R. Tedy chceš mít adresu protocol://domain.tld/file.xls a po jejím navštívění začít stahovat soubor jiný, třeba moje.xls? Pak je mod_rewrite nejlepším řešením.

Nípal: V případě PDF se chová IE myslim stejně jako Firefox, tedy rovnou zobrazí obsah (pomocí pluginu).
Ne, tady nejde vůbec o content-disposition: attachment, ten samozřejmě funguje naprosto korektně, s tím že se otevírá zmiňované dialogové okno. V případě ale již známých (asociovaných) datových typů (*.doc, *.xls) chci, aby se soubor otevřel přímo a aby uživatel nemusel ještě odklikávat Otevřít. A k tomu právě slouží Content-Disposition: inline, který bohužel v IE nedělá co má, konkrétně u souborů (*.doc, *.xls), kde je prostě nový název ignorován. Třeba PDF a další soubory jsou OK. Vím, že je to dáno až moc velkou integrací IE a MS Office, kdy prohlížeč neotevře Word, ale wordovský dokument se otevře přímo v prohlížeči. Ale i tak toto chování považuji za chybné. Na druhou stranu je to celkem prkotina, jen mě zajímalo, jestli to někdo neřešil.

Jinak princip je ten, že v prohlížeči závolám php skript např. localhost/show-file.php, ten mi otevře soubor 'adresar/nazev1.xls' pod názvem nazev2.xls. A když dám následně uložit soubor jako, tak aby se mi automaticky přednastavil nazev2.xls (což se v IE neděje).
Aha, tak v tom případě jsem první příspěvek správně nepochopil.

Ten projekt, ke kterému se váže tento problém, asi není určen pro širší spektrum uživatelů, že? Osobně totiž nevím o nikom, komu by tento způsob integrace Microsoft Office do prohlížeče fungoval bez problémů.
Naopak, to projekt určený pro hodně široké publikum :). Proč by neměl fungovat bez problému? To je přeci naprosto normální chování IE, stejně jako když v IE klikneš na odkaz <a href="soubor.xls">odkaz</a>, tak se ti ten excel načte přímo do prohlížeče, takže v tom nehledejte nic nestandardního, to už je léta funkční a prověřená věc milióny lidí po celým světě :).

A já potřebuji nasimulovat úplně stejné chování, ale aby byly splněny dvě podmínky:

1) uživatel se nedozvěl cestu k tomu souboru (kvůli přístupovým právům, která se ověří pří volání skriptu show-file.php)
2) uživateli se soubor otevřel pod názvem, který mu sám podstrčím

To samozřejmě splňuje content-disposition: attachment, u kterého je ale navíc to otravné dialogové okno u již jednou asociovaných přípon.
Tak se zřejmě jedná opět o nějakou chybu IE - pokud máš IE8 zkus popřepínat mezi režimy, třeba to v některém fungovat bude. Zkoušels content-disposition:inline i s jinými soubory(pdf,html,jpg)? Podle RFC (http://www.faqs.org/rfcs/rfc2183) by se měly známé přípony zobrazit okamžitě... minimálně stoji za zjištění, jestli IE parametr "inline" nebere vůbec nebo pouze s opravdu známými příponami (png,jpg,txt).

Při pokusu o hledání jsem nenašel žádné řešení, jen pár povzdechnutí na tím, že "IE tyto hlavičky občas ignoruje".
Určitě zkoušel, problém je pouze s těmi soubory, které se otevřou přímo v prohlížeči, takže třeba u takového PDF IE volá externí aplikaci (Acrobat Reader) a vše je OK. Jinak to dělá ve všech režimech.

Každopádně to moje současné řešení je i tak plně funkční. Tohle je jenom taková třešnička na dortu, aby uživatel nemusel při ukládání zadávat svůj název souboru, ale aby mu byl nabídnut automaticky.
Ještě mě napadla taková hloupost. IE při ukládání nabídne jako výchozí název souboru název stránky definový u html souboru tagem title. V tomhle případě se ale pochopitelně nejedná o html soubor, takže otázka zní, zda tento title lze nastavít i pomocí hlavičky HTTP protokolu. Sice jsem už procházel přehled HTTP hlaviček a nic jsem nenašel, ale mohl jsem něco přehlédnout.
Pavero: Nemám to teď kde vyzkoušet, ale připadalo by mi normální, kdyby jako výchozí název souboru bral název udaný ve "filename" u content-disposition. Domnívám se, že jiná hlavička, která udává název souboru, neexistuje (možná mě ale klamě pamět a neumím hledat..).

A chápu správně, že pokud místo xls souboru pošleš např. jpeg nebo pdfko (i s odpovídajícím mime typem), tak se zobrazí bez nabídky "co dělat"? (Protože neodhadnu ke kterému z dotazů se odpověd "určitě zkoušel" váže :)
Nojo, ono se to fakt otvírá přímo v tom prohlížeči :-O
Ale nevim, mě se přímo v něm otevře DOC i PDF - nebo je rozdíl i podle toho, jestli je ta aplikace nějak těsněji integrovaná do prohlížeče (Office) anebo externí (Foxit)?
Ano, to že se to ale otevírá přímo v prohlížeči, by ještě vůbec ničemu nemělo vadit. PDF formát se mi ve Firefoxu také otevírá integrovaně, přitom prohlížeč nabídne název souboru definovaný filename.

Pouze v případě IE, když je výstupní soubor načten přímo do prohlížeče je zkrátka filename ignorován.

Tady je malá ukázka k vyzkoušení:
http://pavero.wz.cz/temp/odkazy.html

Zajímavé je, že když se klikne v IE pravým a dá uložit jako, tak to správně doplní názvy z filename :).

Pokud by někdo měl možnost to testnout v IE6 (zda jsou všechny tři odkazy funkční), budu moc rád, já tady IE6 nikde momentálně nemám.
Pavero: Tak po vyzkoušení příkladu jsem zjistil, že atribut filename u content-disposition:inline ignoruje i Firefox.. (pokud teda posíláš hlavičku správně). Při content-disposition:attachement jej bere jak IE, tak Firefox a snad všechny prohlížeče.

Mimochodem, dostal jsem se k IE7, zkoušel jsem zobrazit MS Office dokumenty, ale nepodařilo se. Zřejmě jsem s Office nenainstaloval i potřebný plugin :) - většinu takových blbůstek automaticky při instalaci vyškrtávám.

Řešení pro zobrazení jiného titulku (než názvu souboru) při zobrazení "inline" zřejmě neexistuje... tedy existuje asi jen složité opisné řešení přes mod_rewrite, kdy se požadovaný název narve do skutečné adresy a směrování na php skript (místo souboru) se provede až "uvnitř" serveru.
A jakou verzi Firefoxu používáš? Já mám 3.5 a naprosto v pohodě, vyzkoušeno asi 15 různých přípon a filename vždy rozpoznán.

A co že ti dělá ten IE7? Nabídne ti aspoň možnost stažení souboru?
Hm, taky by mě zajímalo, proč existuje tolik mime typů pro Excel :-/.

http://mimeapplication.net/x-msexcel
>> Hm, taky by mě zajímalo, proč existuje tolik mime typů pro Excel
Že by Microsoft? Ten prosazuje taktiku "za každou cenu" než "držet se standardu".
Pavero:IE samozřejmě stažení souboru nabídne, i s korektním filename. Možná mi prostě chybí nějaký plugin pro otevírání Office dokumentů v prohlížeči.

Firefox poslední verze (3.5.3). Při navštívení tvé ukázky http://pavero.wz.cz/temp/jpg.php mi zůstane v titulku "jpg.php (JPEG obrázek, 399x396 bodů)". A pokud jsem to dobře pochopil, snažíš se, aby se zobrazilo "jpg.jpg".
>> http://pavero.wz.cz/temp/jpg.php
Přímé zobrazení se skoro u všech zobrazuje jako jpg.php včetně v infu. Pokud zvolím uložit, pak se nabídne jako jpg.jpg.

>> http://pavero.wz.cz/temp/excel.php
Mám OpenOffice, takže v IE8 se nezobrazí přímo, ale k uložení nabídne excel.xls.

V IE6 jsem nezkoušel. Mám Visty a tam to nejde nativně. Přes IETester to zahlásí chybou, ale to bude spíše aplikaci.
Což se naskýtá otázka, při ukládáni se nabídne požadovaný název. Ale při přímém zobrazení toto ignoruje a bere název souboru, který byl spuštěn. Tedy content-disposition by měl smysl jen při ukládáni a ne při zobrazení.
Díky za vyzkoušení, zdá se, že se to chová celkem OK, tedy až na ty názvy souborů při ukladání v IE :).

to Freeze: Tak ten Firefox je ok, to že v adresním řádku a na záložce zůstane jpg.php je v pořádku, tak se chovájí všechny prohlížeče stejně. Pokud ale dáš Soubor/Uložit jako, pak se ti korektně nabídne jpg.jpg, narozdíl od IE.

to Tomik: díky za ten IETester, o něm jsem nevěděl, sice jak čtu, spoustu věcí nasimulovat neumí, ale i tak se bude hodit.
Pavero: Na simulaci IE6 lze použít samotný "IE6 standalone" - oficiálně ale není z dílny MS - funguje sice taky tak napůl, ale jako krizovka pro zkoušení to jde :)
Freeze: IE6 standalone mi fungoval v XP a mám ho ještě zahrabaný v bordelu. Tak jsem ho vyhrabal a na Vistě mi už bohužel nefungoval a to i přes režim kompatibility :(
Tak mám teď k dispozici virtualizovaný Windows XP s IE6, Office2003 a Adobe Reader 9

XLS soubor - zobrazí okno ke stažení. Kliknutím na spustit se zobrazí v okně prohlížeče (uveden jako excel.php). Uložit jako se uloží pod jménem excel.xls

JPG obrázek - otevře přímo v okně (uveden jako jpg.php). Volba uložit cíl jako zobrazí název jako jpg.jpg

PDF dokument - zobrazí přímo v prohlížeči bez optání (uveden jako pdf.php). Volba uložit cíl jako zobrazí název jako pdf.pdf