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 | 1271
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 | 212
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 | 431
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 | 212
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 | 212
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 | 8285
Dost možná je ten znak v nějakém skriptu. Zkus použít Tracy\OutputDebugger::enable() a najít ho.