Ako zmazať temp subor posielany cez sendResponse

japlavaren
Člen | 404
+
0
-

ahoj,

v aplikacii generujem subor ktory sa generuje do temp adresaru. Ako zmazat tento subor po jeho odoslani do prehliadaca? Skusal som nieco ako

<?php
public function renderFile()
{
	try {
		$file = $this->docService->create();
		$this->sendResponse(new FileResponse($file));
	} finally {
		$this->docService->cleanup();
	}
}
?>

problem je ze send response interne vyhodi AbortException a finally sa zavola skor ako sa to odosle do prehliadaca

jiri.pudil
Nette Blogger | 1032
+
0
-

Můžeš to třeba navěsit do shutdown funkce. Ale spíš bych volil cestu přímého vypsání obsahu souboru, pak vůbec nepotřebuješ ukládat nic na disk :)

japlavaren
Člen | 404
+
0
-

jiri.pudil napsal(a):

Můžeš to třeba navěsit do shutdown funkce. Ale spíš bych volil cestu přímého vypsání obsahu souboru, pak vůbec nepotřebuješ ukládat nic na disk :)

Shutdown funkcia sa mi nepaci. Pouzivam plugin ktory to nedokaze vratit ako string ale uklada do suboru. A nacitavat to zo suboru a a predavat to do response sa mi velmi nepaci.

Mysteria
Člen | 797
+
+1
-

Co takhle použít dočasnej soubor, který se maže sám po skončení skriptu https://secure.php.net/….tmpfile.php.
Případně můžeš periodicky cronem mazat třeba soubory starší než den.

voda
Člen | 561
+
+1
-

Ještě můžeš využít Application::$onShutdown události.

David Matějka
Moderator | 6445
+
+4
-

podedil nebo odekoroval bych FileResponse, aby to po odeslani soubor smazalo

japlavaren
Člen | 404
+
0
-

Mysteria napsal(a):

Co takhle použít dočasnej soubor, který se maže sám po skončení skriptu https://secure.php.net/….tmpfile.php.
Případně můžeš periodicky cronem mazat třeba soubory starší než den.

tmpfile() som pozeral ale ten vrati handler a PHPWord pracuje s nazvom suboru. To mi nepomoze. A mazanie cronom by bola tiez moznost ale pride mi to dost komplikovane na takuto blbost.

japlavaren
Člen | 404
+
0
-

David Matějka napsal(a):

podedil nebo odekoroval bych FileResponse, aby to po odeslani soubor smazalo

To ma nenapadlo a prijde mi to ako najlepsi napad.

japlavaren
Člen | 404
+
+1
-

Nakoniec som to vyriesil takto:

<?php
$this->sendResponse(new CallbackResponse(function (IRequest $request, IResponse $response) {
	try {
		$file = $this->docService->createDoc();
		(new FileResponse($file))->send($request, $response);
	} finally {
		$this->docService->cleanup();
	}
}));
?>

Editoval japlavaren (6. 11. 2018 11:48)