FileResponse – Invalid response
- Aishak
- Člen | 30
Zdravím,
dnes se nám objevil zajímavý problém.
Mám formulář, který na základě zaškrtaných polí dokáže vygenerovat příslušný CSV soubor, který uloží na disk a pak následně jej pošle přes FileResponse. Bohužel při zaškrtnutí jednoho konkrétního pole se v Chromu ukáže chyba ERR_INVALID_RESPONSE (stejně tak nefunguje v ostatních prohlížečích). Soubor se i tak uloží tak jak má, jenom nastane ta chyba a to až při sendResponse.
<?php
public function exportFormSuccess($form) {
$values = $form->getValues(true);
$data = $this->impexp->exportVarioData($values);
$fileName = $this->uniqidReal() . '.csv';
$filePath = 'csv/' . $fileName;
$file = fopen($filePath, "w");
foreach ($data as $line) {
fputcsv($file, (array) $line, ';');
}
fclose($file);
$this->impexp->lsisLog('export', $filePath, 'vario');
$response = new FileResponse($filePath);
try {
$this->sendResponse($response);
} catch (Nette\Application\AbortException $ex) {
// Zachytí chybu s kódem 0 a prázdnou zprávou -> udělám tedy jenom redirect
$this->redirect('this');
}
}
?>
Zajímavé je, že mám na té samé stránce i seznam souborů, kde je i tlačítko na stažení, které směruje na metodu downloadFile.
<?php
public function handleDownloadFile($filePath) {
$response = new FileResponse($filePath);
$this->sendResponse($response);
}
?>
Zde naleznu i můj požadovaný soubor u kterého mi vyhodí sendResponse()
chybu popsanou výše a přes downloadFile se mi soubor již podaří normálně
stáhnout.
Nutno říci, že fungovala i první možnost bez problémů. Nedělal jsem
žádný update, ani nic podobného.
Děkuji za jakoukoliv pomoc :)
- Aishak
- Člen | 30
CZechBoY napsal(a):
V logu není nic? Zkus si místo ukládání souboru na disk dát výpis do prohlížeče a koukni jestli tam nejsou nějaký chyby.
V logu nic není.
David Matějka napsal(a):
proc tam mas to chytani AbortException? smaz to..
Nemá na to žádný vliv, původně jsem to tam ani neměl, zkoušel jsem nyní pouze k řešení chyby, zda mi to k něčemu nepomůže. Zapomněl jsem to tu odstranit.
- Aishak
- Člen | 30
Milo napsal(a):
Zkus po
fclose()
zavolatclearstatcache()
, ale to vařím z vody.
Bohužel nepomohlo.
Již jsem zjistil možnou příčinu. Jde o množství dat, která se exportují do CSV. Co mi ale hlava nebere, že to vyhodí ERR_INVALID_RESPONSE, ale soubor lze prakticky stejným způsobem vzápětí stáhnout.
- Aishak
- Člen | 30
Milo napsal(a):
V logu PHP/Apache nic? Možná to padá na paměti.
Nejdřív v logu nebylo nic. Po pár dnech to začalo padat na paměť. To jsme si nedokázali vysvětlit, protože máme celkem velkou rezervu. Nakonec vyřešeno úplně jednoduše restartováním serveru. Proč se tohle stalo netušíme.
Děkuji všem za pomoc.