Laravel Nova Action met download response

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 10-04 14:33
Mijn vraag
Voor mijn werk ben ik een Laravel applicatie aan het maken.
Nu wil ik dat als er een Action wordt gerund deze een .zip bestand terug stuurt naar de gebruiker.

De zip wordt gemaakt en opgeslagen in de storage/app/public map. In de netwerk tab van Chrome toont ook dat de response .zip terug krijgt maar weigert de download te starten.

PHP:
1
2
3
4
return response()->download($zipFileName, basename($zipFileName), [
    'Content-Type' => 'application/zip',
    'Content-Disposition' => 'attachment; filename="' . basename($zipFileName) . '"'
])->deleteFileAfterSend(true);


De rest van de code is niet interessant en maakt de bestanden aan, zet dit om naar .zip en stuurt alles terug naar de gebruiker.

Ik zie het even niet meer, misschien dat iemand anders zit wat ik fout doe of een andere oplossing heeft.
Bij voorbaat dank!

Relevante software en hardware die ik gebruik
Laravel Nova - v4.26.0
Laravel - v10.14.0
PHPStorm

Wat ik al gevonden of geprobeerd heb
ChatGPT :)
https://codeanddeploy.com...ownload-file-in-laravel-8
https://laracasts.com/dis...rom-a-laravel-nova-action

Beste antwoord (via Groax op 28-06-2023 11:42)


  • Whinger
  • Registratie: Mei 2012
  • Laatst online: 19-06 08:57
In plaats van dat je een response()->download teruggeeft vanuit de Nova Action, zou je een Action::download() response terug moeten geven met de locatie (volledige URL, dus niet het lokale pad) van het zip bestandje (aangezien je hem toch in je public folder plaatst).

Zie ook https://nova.laravel.com/...s.html#download-responses

[ Voor 6% gewijzigd door Whinger op 28-06-2023 11:15 ]

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Whinger
  • Registratie: Mei 2012
  • Laatst online: 19-06 08:57
In plaats van dat je een response()->download teruggeeft vanuit de Nova Action, zou je een Action::download() response terug moeten geven met de locatie (volledige URL, dus niet het lokale pad) van het zip bestandje (aangezien je hem toch in je public folder plaatst).

Zie ook https://nova.laravel.com/...s.html#download-responses

[ Voor 6% gewijzigd door Whinger op 28-06-2023 11:15 ]


Acties:
  • +1 Henk 'm!

  • Oon
  • Registratie: Juni 2019
  • Niet online

Oon

Is er een specifieke reden dat je deze download vanuit PHP wil triggeren?
Hierbij heb je namelijk veel meer overhead; je download gaat door PHP heen en je child proces blijft daarmee draaien tot de download klaar is.
Afhankelijk van context kan het handig zijn om gewoon de download URL terug te geven vanuit PHP, en dan clientside een download te triggeren (iframe of nieuw tab openen vanuit JS). De browser vraagt dan het bestand direct op vanaf de webserver, waar PHP zich niet mee hoeft te bemoeien, en dan hoef je verder ook geen headers te zetten ofzo.
Qua schaalbaarheid/performance is dat een stuk beter, je hebt het bestand immers al in je public mapje staan.

Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 10-04 14:33
@Whinger

PHP:
1
return Action::download($zipFileName, basename($zipFileName));

dan krijg ik netjes de response maar geen download

code:
1
2
3
4
{
    "download": "*snip*\storage\app\public\orders.zip",
    "name": "orders.zip"
}


plak ik de path in de browser, download die hem wel. Dus de path is goed.

Acties:
  • +1 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 10-04 14:33
Oon schreef op woensdag 28 juni 2023 @ 11:23:
Is er een specifieke reden dat je deze download vanuit PHP wil triggeren?
Hierbij heb je namelijk veel meer overhead; je download gaat door PHP heen en je child proces blijft daarmee draaien tot de download klaar is.
Afhankelijk van context kan het handig zijn om gewoon de download URL terug te geven vanuit PHP, en dan clientside een download te triggeren (iframe of nieuw tab openen vanuit JS). De browser vraagt dan het bestand direct op vanaf de webserver, waar PHP zich niet mee hoeft te bemoeien, en dan hoef je verder ook geen headers te zetten ofzo.
Qua schaalbaarheid/performance is dat een stuk beter, je hebt het bestand immers al in je public mapje staan.
We hebben het hier over laravel Nova he :P Ik ben totaal geen front-end persoon en bij bootstrap en de standaard JS meuk houd mijn kennis met frond-end wel op.

Wat ik nog kan proberen is een Notification maken en hier de download link in plaatsen. Maar dan moet ik het bestand houden dit wil ik niet.

Qua performance boeit dit amper. ja, de orders kunnen oplopen tot in de duizenden maar deze action wordt misschien 1x of 2x in het jaar gedraait. Dus er een Job voor maken is ook een overkill.

Acties:
  • +1 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 10-04 14:33
Veranderde de file path naar een URL en de download deed het perfect.

PHP:
1
return Action::download(url('/').'/storage/orders.zip', basename($zipFileName));

Helaas kan de delete na de download dan niet maar daar vind ik wel wat anders op.

@Whinger, bedankt!
Pagina: 1