Mazanie suboru po samotnej akcii sťiahnuť súbor
- KristianSubweb
- Člen | 146
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 :)
- Martk
- Člen | 661
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. 2019 18:28)
- Milo
- Nette Core | 1283
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());
}
}
- KristianSubweb
- Člen | 146
@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()); } }
- KristianSubweb
- Člen | 146
@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)));
- KristianSubweb
- Člen | 146
@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. 2019 18:31)
- japlavaren
- Člen | 404
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();
}
}));
?>