Problém se stažením souboru typu doc

n.u.r.v.
Člen | 485
+
0
-

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)

David Matějka
Moderator | 6445
+
0
-

Ahoj,
a co ti brani z toho udelat vlastni response?

Felix
Nette Core | 1183
+
0
-

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.

https://contributte.org/…ication.html#…

n.u.r.v.
Člen | 485
+
0
-

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 | 198
+
0
-

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
+
0
-

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
+
0
-

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/#…

n.u.r.v.
Člen | 485
+
0
-

nene, on se soubor stáhne na disk, browser s tím nic nedělá. Taky je to jako nepovinný parametr FileResponse (forceDownload = true)

Gappa
Nette Blogger | 198
+
0
-

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.

n.u.r.v.
Člen | 485
+
0
-

JJ, ke stažení zde

Je tam originál, poškozený a stažený přes ručně napsané hlavičky…

Gappa
Nette Blogger | 198
+
0
-

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 | 8082
+
+5
-

Dost možná je ten znak v nějakém skriptu. Zkus použít Tracy\OutputDebugger::enable() a najít ho.

n.u.r.v.
Člen | 485
+
+3
-

@DavidGrudl Díky, škoda že tu není smajlík facepalm – mezera byla v bootstrap.php na začátku…

libik
Člen | 96
+
+1
-

Diky za dotaz a odpovedi! Klient si editoval index.php a provedl to same – odradkovani na zacatku skriptu a DOC(X) byly od te doby nepouzitelne. Nevim jak dlouho bych to hledal…

Pavel Kravčík
Člen | 1180
+
+6
-

Klient si editoval index.php – kill it with fire…