Problém se stažením souboru typu doc
- n.u.r.v.
- Člen | 485
Ahoj, v nette mám řešeno stahováni souboru takto:
$this->sendResponse(new Responses\FileResponse($cestaksouboru, $nazevsouboru));
$this->terminate();
A funguje to až na soubory doc. (ne docx). Při stažení se něco stane a soubor je nepoužitelný (ms word má hlásí chybu kódování a libre office to otvírají 5 minut a hlásí 50000 stran).
Dělá to jen na hostingu, na localu to funguje správně.
Zatím mám řešení, že u typu doc dělám stahování takto (kod nalezen na webu):
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/msword");
header("Content-Disposition: attachment; filename=\"" . $filename . "." . $type . "\";");
header("Content-Transfer-Encoding: binary");
ob_clean();
flush();
readfile($cestaksouboru);
$this->terminate();
Funguje to, ale já bych to chtěl mít sjednoceno přes sendResponse/fileresponse
Díky za radu
Editoval n.u.r.v. (8. 8. 2019 15:49)
- Felix
- Nette Core | 1247
n.u.r.v. napsal(a):
Funguje to, ale já bych to chtěl mít sjednoceno přes sendResponse/fileresponse
Díky za radu
Zkus mrknout na pripravene Nette\Application\Response
z contributte/application balicku.
- n.u.r.v.
- Člen | 485
Díky, ale nevím co z toho vyčíst, jde mi o to, proč to jen u typu doc
dělá problémy když jiné typy souboru jdou bez toho abych něco já ručně
nastavoval. A i když nastavím content-type v FileResponse na
application/msword, tak to nejde.
A také je divné, že na localu (win) to nedělá problém, ale na hostingu
(linux) ano.
Zatím jsem teda nastavil přes HttpResponse hlavičky ručně a soubor načítám přes readfile a funguje to…
- Gappa
- Nette Blogger | 209
n.u.r.v. napsal(a):
A funguje to až na soubory doc. (ne docx). Při stažení se něco stane a soubor je nepoužitelný (ms word má hlásí chybu kódování a libre office to otvírají 5 minut a hlásí 50000 stran).
Ten soubor je jiný jak? Velikostí? A/nebo obsahem?
Ještě jsem koukal na správné mime type, ale tím by to asi být nemělo, ale pro jistotu je jejich seznam tady:
- n.u.r.v.
- Člen | 485
Ahoj, je jiný tak, že word při spuštění zobrazí rozsypaný čaj a nabídku kodování. Libre office to zase otvírají x minut a z jednostránkového dokumentu vznikne dokument o 50000 stránkách s rozsypaným čajem. Velikost odpovídá.
Edit: Bude to něco s nastavením serveru, něco asi změnili na hostingu, protože kdysi stahování doc fungovalo a nyní ne. Akorát netuším co na to může mít vliv…
A k tomu jsem zjistil, že to dělají i docx (s tím rozdílem, že docx dokáže word opravit). Tohle vše ale ještě nedávno fungovalo. PDF zatím fungují.
Editoval n.u.r.v. (12. 8. 2019 13:01)
- ic
- Člen | 430
A jestli správně rozumím požadavku, jde o to, aby se soubor stáhl a neprováděla se defaultní akce prohlížeče, což může být otevření v nějakém cloudovém office či desktopovém office, ale aby se to za všech okolností stáhlo?
Pak by se to dalo řešit běžným odkazem na soubor jen s atributem
download
. Dříve byl problematický kvůli špatné podpoře, ale
dnes už je to pohoda… viz. https://caniuse.com/#…
- Gappa
- Nette Blogger | 209
n.u.r.v. napsal(a):
Ahoj, je jiný tak, že word při spuštění zobrazí rozsypaný čaj a nabídku kodování. Libre office to zase otvírají x minut a z jednostránkového dokumentu vznikne dokument o 50000 stránkách s rozsypaným čajem. Velikost odpovídá.
Edit: Bude to něco s nastavením serveru, něco asi změnili na hostingu, protože kdysi stahování doc fungovalo a nyní ne. Akorát netuším co na to může mít vliv…
A k tomu jsem zjistil, že to dělají i docx (s tím rozdílem, že docx dokáže word opravit). Tohle vše ale ještě nedávno fungovalo. PDF zatím fungují.
Nešlo by někam nahrát (testovací, ale text třeba kus z wiki, s češtinou) originál a poškozený soubor? Docela by mě zajímalo, co se s tím souborem vlastně stane.
- Gappa
- Nette Blogger | 209
Na začátku poškozeného souboru je v HEX 0A
, což je LF,
tedy odřádkování, zbytek souboru je o to posunutý.
Pokud se toto smaže, soubor funguje – i když je o byte kratší, ale ten
konec je stejně doplněný do dané délky jen pomocí 00
, což
je NULL.
Takže se nějak podaří serveru přidat na začátek souboru to odřádkování, ale zachovat výslednou délku.
- David Grudl
- Nette Core | 8239
Dost možná je ten znak v nějakém skriptu. Zkus použít Tracy\OutputDebugger::enable() a najít ho.