Mazanie suboru po samotnej akcii sťiahnuť súbor

před 11 měsíci

KristianSubweb
Člen | 106
+
0
-

Ahojte mám taký problém potrebujem spraviť niečo nasledovné. Potrebujem stiahnúť faktúru ktorá ale reálne može existovať na disku len v danú chvílu pri akcii download.

Takže pred samotným stiahntím si vygenerujem pdf uložím, sťiahnem a následne ho chcem vymazať s disku.

public function handleDownloadInvoice($id) {
		$this->hasPermissionModule(\Permission::VIEW);

		$invoice = $this->invoiceService->getByIdAndCompanyId($id, $this->user->getCompanyId());

		//Generate pdf and save file on server
		$pdfFileName = $this->invoiceService->generatePdf($invoice);
		$invoice->setFileName($pdfFileName);
		$this->invoiceService->update($invoice);

		$basePath = $this->dirService->getWwwDir();

        //Download invoice
        $fileResponse = new FileResponse($invoice->getFileName());
        $this->sendResponse($fileResponse);

		//Delete invoice file
        Functions::deleteFilesOnDirectory($basePath . "/" . $invoice->getFileName());

    }

Akonáhle funkcia spravý sendResponse dalej sa nedostanem.
Za vaše reakcie ďakujem :)

před 11 měsíci

Martk
Člen | 535
+
0
-

Proč dělat tohle? Mít string s pdf, ten uložit do souboru, přečíst soubor a uložit do stringu, pak smazat soubor? Nelze jen odeslat ten string, bez manipulací souborů? (tohle je jen řečnická otázka)

V invoice udělej generateToString a v generatePdf, jí můžeš zároveň použít.

PS: Vytvoř si novou response, která se bude chovat, tak jak potřebuješ a ten response odesílej

Editoval Martk (26. 1. 18:28)

před 11 měsíci

trejjam
Backer | 64
+
0
-

Toto jsme resili pomoci:

@Martk soubor neni treba natahovat do pameti

před 11 měsíci

KristianSubweb
Člen | 106
+
0
-

@trejjam pls nevieš mi poradiť ako presne to viem implementovať ?

před 11 měsíci

Milo
Nette Core | 1151
+
+3
-

Co třeba dekorací…

use Nette\Application\Responses\FileResponse;
use Nette\Http\IRequest;
use Nette\Http\IResponse;

final class DownloadAndDeleteFileResponse
{
	private $response;

	public function __construct(FileResponse $response)
	{
		$this->response = $response;
	}

	public funcion send(IRequest $request, IResponse $response)
	{
		$this->response->send($request, $response);
		unlink($this->response->getFile());
	}
}

před 11 měsíci

KristianSubweb
Člen | 106
+
0
-

@Milo a pls nevieš poradiť ako napísať tu decoraci? :D sorač

Milo napsal(a):

Co třeba dekorací…

use Nette\Application\Responses\FileResponse;
use Nette\Http\IRequest;
use Nette\Http\IResponse;

final class DownloadAndDeleteFileResponse
{
	private $response;

	public function __construct(FileResponse $response)
	{
		$this->response = $response;
	}

	public funcion send(IRequest $request, IResponse $response)
	{
		$this->response->send($request, $response);
		unlink($this->response->getFile());
	}
}

před 11 měsíci

Martk
Člen | 535
+
+3
-

To co @Milo napsal je návrhový vzor dekorátor, použití takhle

$this->sendResponse(new DownloadAndDeleteFileResponse(new FileResponse($filename)));

před 11 měsíci

KristianSubweb
Člen | 106
+
0
-

@Martk nejde on čaka IResponse

Argument 1 passed to Nette\Application\UI\Presenter::sendResponse() must implement interface Nette\Application\IResponse, instance of DefaultModule\Classes\DownloadAndDeleteFileResponse given, called in /Users/kristianbukva/Documents/www/service/app/AdminModule/Modules/InvoiceModule/presenters/InvoicePresenter.php on line 226

Martk napsal(a):

To co @Milo napsal je návrhový vzor dekorátor, použití takhle

$this->sendResponse(new DownloadAndDeleteFileResponse(new FileResponse($filename)));

před 11 měsíci

KristianSubweb
Člen | 106
+
0
-

@Martk nejde on čaka IResponse

Argument 1 passed to Nette\Application\UI\Presenter::sendResponse() must implement interface Nette\Application\IResponse, instance of DefaultModule\Classes\DownloadAndDeleteFileResponse given, called in /Users/kristianbukva/Documents/www/service/app/AdminModule/Modules/InvoiceModule/presenters/InvoicePresenter.php on line 226

Martk napsal(a):

To co @Milo napsal je návrhový vzor dekorátor, použití takhle

$this->sendResponse(new DownloadAndDeleteFileResponse(new FileResponse($filename)));

Takto to mám napísané

public function handleDownloadInvoice($id) {
		$this->hasPermissionModule(\Permission::VIEW);

		$invoice = $this->invoiceService->getByIdAndCompanyId($id, $this->user->getCompanyId());

		$pdfFileName = $this->invoiceService->generatePdf($invoice);

		$invoice->setFileName($pdfFileName);

        $this->invoiceService->update($invoice);

        $file = $this->dirService->getWwwDir() . "/" . $invoice->getFileName();

		$this->sendResponse(new DownloadAndDeleteFileResponse(new FileResponse($file)));
	}

Editoval KristianSubweb (29. 1. 18:31)

před 11 měsíci

MajklNajt
Člen | 265
+
+2
-

čo tak zapojiť trošku vlasntého rozumu?

final class DownloadAndDeleteFileResponse implements Nette\Application\IResponse
{
...
}

před 10 měsíci

KristianSubweb
Člen | 106
+
0
-

Ďakujem vám sorry ja dement som si to vobec nevšimol. :) Dik

před 10 měsíci

japlavaren
Backer | 415
+
+1
-

ak ti to staci na jednom mieste a si lenivy robit na to novu class, postaci aj calback response:

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