Autor Zpráva
Pavel Dumbrovský
Profil
Dobrý den,
měl bych celkem stručný dotaz. Následující kód mám pro stažení souborů:


header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($cesta.$soubor));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($cesta.$soubor));
    ob_clean();
    flush();
    readfile($cesta.$soubor);
    exit;



Ovšem všechny názvy souborů mám s diakritikou, jsou v nich mezery, zkrátka nic moc. V chromu to funguje ok, sobor se stáhne. V IE jak kdy (velmi zvláštní) - 3x to vyhodí chybu, pak soubor již lze stáhnout, jak kdy. Ve firefoxu je to ještě horší, tam se stáhne soubor s názvem jen po první mezeru, takže to nejde spustit. Za předpokladu, že s názvy souborů nemůžu hýbat, lze to nějak ošetřit?

Díky.
Ugo
Profil
ten soubor přejmenuj pro stažení (filename=novy_nazev) a pro IE bych tam dal prazdny hlavičky Pragma, Cache .. má s nimi problém, odzkoušeno že je stačí nastavit na prázdné, nevím jak funguje s těmito, možná to je ta hodnota kterou umí :)
Pavel Dumbrovský
Profil
Ano, přejmenovat soubor hned po nahrátí, nebo pro stažení by bylo ideální a jednoduché. Ale já bych potřeboval vědět, zda-li existuje řešení, když se soubor s tím samým názvem musí i stáhnout?
Tori
Profil
Pavel Dumbrovský:
Ve firefoxu je to ještě horší, tam se stáhne soubor s názvem jen po první mezeru
Pro začátek bych dala název souboru do uvozovek
header('Content-Disposition: attachment; filename="'.basename($cesta.$soubor).'"');
Jinak na serveru se vám ten soubor najde a odešle v pořádku, i když má v názvu takové znaky? Pokud je problém i tam, tak by myslím netrvalo dlouho napsat skript, který načte názvy všech souborů z DB, na disku je přejmenuje na něco odpovídajícího [a-zA-Z0-9_.-] a původní názvy uloží do DB (abyste je mohl nastavit při stahování).
Pavel Dumbrovský
Profil
Tori:
Díky, ty uvozovky pomohly, vida. :)

Akorát v IE je problém, týká se to pouze souborů ve kterých je diakritika, mezery nevadí. Když se soubor stáhne, tak nejde otevřít (pdf). Háže to chybu, že soubor není podporován, nebo byl porušen při transferu. Co s tímhle? Děkuju!
Tori
Profil
Pavel Dumbrovský:
Háže to chybu, že soubor není podporován, nebo byl porušen při transferu
A co z toho to tedy je? Když dáte na serveru odesílat soubory pod nějakým jménem bez mezer a diakritiky (třeba napevno napsané), dá se otevřít? A když ho stáhnete přes FTP, tak taky nepůjde? (= kde na té cestě klient--server--klient dochází k poškození, pokud vůbec).
Pavel Dumbrovský
Profil
Tori:
Na serveru je to ok. Přes Chrome a Firefox je stahování všech souborů již ok. Pouze přes IE se ten soubor stáhne a má 0 bytů.
Pavel Dumbrovský
Profil
Jakmile ošetřím to stahování souboru podmínkou file_exists , tak v IE vyhodí chybu, nenajde ho..
Kajman_
Profil *
Pavel Dumbrovský:
Pokud tyto proměnné získáváte z querystringu, tak mohou prohlížeče posílat query string v různém kódování. Zjistěte ho a použijte případně iconv.
Kajman_
Profil *
Nebo používejte urlencode už při generování odkazů.
Pavel Dumbrovský
Profil
Pravděpodobně to bude kódováním, když kouknu na soubory s diakritikou přes ftp, tak místo Sáblík je tam SáblĂ­k . Ostatní prohlížeče si s tím poradí, IE ne.. Ale tak toto už bych asi mohl obejít tím, že soubory budu ukládat s nějakým rozumným názvem a na výstupu při stahování jim zase vrátím původní název, který si schovám v DB..
Pavel Dumbrovský
Profil
Problém je tedy v tom, že soubory se na server uloží s rozkódovaným názvem. Jakou fci použít, abych to dal dokupy?
Knight
Profil
Pokud nejsou na ftp potřeba originální názvy, dalo by se použít třeba uniqid().

Ale proč je v nich potřeba diakritika? S tím jsou jen problémy. Nebylo by lepší je přejmenovávat do tvaru nazev-souboru-bez-nezadoucich-znaku-a-diakritiky.abc?
Pavel Dumbrovský
Profil
Ano, asi to tak udělám. Jen mě zajímalo, proč pouze v IE je s tím problém.
Knight
Profil
Problém bude zřejmě v tom, že IE čeká název souboru v kódování windows 1250.

header('Content-Disposition: attachment; filename="' . iconv("UTF-8", "cp1250", basename($cesta.$soubor)) . '"');


Tohle by mělo v IE fungovat. Samo se tam musí změnit to vstupní kódování.
Pavel Dumbrovský
Profil
V IE to opravdu pomohlo, ale zase to poškodilo ostatní prohlížeče.. Fakt jsou s tím jen problémy, soubor nazvu podle ID, při výstupu mu vnutím název z DB a hotovo.

Všem mockrát děkuji za cenné rady!
SeparateSK
Profil
Co tak:
$soubor=str_replace(" ","%20",$soubor);

alebo
$soubor=urlencode($soubor);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0