Ich habe eine Laravel 5.4-App, bei der authentifizierte Benutzer private Dateien aus dem S3-Speicher herunterladen können. Ich habe eine Route und einen Controller eingerichtet, um das Herunterladen von privaten Dateien zu ermöglichen.
Der Code sieht so aus:
Route:
%Vor%Controller:
%Vor% Alles funktioniert gut, aber als ich mir die Laravel-Dokumente näher angesehen habe, habe ich das gefunden Sie reden nur von response()->download()
.
Wenn ich diese Art von Antwort implementiere, würde mein Code wie folgt aussehen:
%Vor%Beide Funktionen finden Sie in der API-Dokumentation .
Meine Frage: Was wäre der bevorzugte Weg und welche Vorteile / Nachteile hat jeder?
Von dem, was ich bisher gesammelt habe:
Stream:
Download:
Wenn Sie Laravel den Helfer response()
aufrufen, wird eine Instanz von Illuminate\Routing\ResponseFactory
zurückgegeben. Die ResponseFactory
hat diese zwei Methoden: download
und stream
- die zwei Methoden in Frage. Wenn Sie etwas tiefer graben, sehen Sie, dass download
eine Instanz von \Symfony\Component\HttpFoundation\BinaryFileResponse
zurückgibt, während stream
eine \Symfony\Component\HttpFoundation\StreamedResponse
zurückgibt - dies sind beides Symfony-Komponenten.
Es ist nicht nötig, den Code hier zu durchforsten, aber es ist schön, zu verstehen, was unter der Haube passiert. Jetzt, da wir wissen, dass die zugrunde liegenden Objekte aus der Symfony-HTTP-Komponente stammen, können wir die Symfony-Dokumente konsultieren und sehen, was sie empfehlen. In der Regel werden Streams verwendet, wenn die Größe der Datei unbekannt ist, z. B. wenn Sie die Datei im laufenden Betrieb erstellen. In den meisten anderen Fällen ist die BinaryFileResponse
, die von der Methode download
generiert wird, für Ihre Bedürfnisse ausreichend.
Sie können sich eine ausführlichere Erklärung des HTTP-Streaming und seiner Anwendungsfälle hier ansehen.