public function getInvoiceDocumentsZip($invitationKey)
{
if (!($invitation = $this->invoiceRepo->findInvoiceByInvitation($invitationKey))) {
return $this->returnError();
}
Session::put('contact_key', $invitation->contact->contact_key);
// track current contact
$invoice = $invitation->invoice;
$toZip = $this->getInvoiceZipDocuments($invoice);
if (!count($toZip)) {
return Response::view('error', ['error' => 'No documents small enough'], 404);
}
$zip = new ZipArchive($invitation->account->name . ' Invoice ' . $invoice->invoice_number . '.zip');
return Response::stream(function () use($toZip, $zip) {
foreach ($toZip as $name => $document) {
$fileStream = $document->getStream();
if ($fileStream) {
$zip->init_file_stream_transfer($name, $document->size, ['time' => $document->created_at->timestamp]);
while ($buffer = fread($fileStream, 256000)) {
$zip->stream_file_part($buffer);
}
fclose($fileStream);
$zip->complete_file_stream();
} else {
$zip->add_file($name, $document->getRaw());
}
}
$zip->finish();
}, 200);
}