Löschen von Dateien nach dem Download in Laravel

Lesezeit: 4 Minuten

Benutzer-Avatar
Vincent

Ich erstelle eine Anwendung, mit der ein Benutzer eine Datei herunterladen kann. Nach dem Download möchte ich, dass die Datei gelöscht wird. Das Ende meines Codes sieht so aus:

return Response::download(public_path() . '/uploads/_tmp/' . urldecode($filename));

was bedeutet, dass die Funktion bei der Rückkehr endet und ich die Datei nicht löschen kann. Ich habe versucht, einen ‘After’-Filter für die Route aufzurufen, aber dann wird die Datei zu schnell gelöscht.

Irgendwelche Ideen?

  • Meinen Sie damit, dass die temporäre Datei, die PHP erstellt, gelöscht werden soll, oder die Datei, die Sie gerade heruntergeladen und irgendwo in Ihrem Dateisystem abgelegt haben? Denn die von PHP im Download-Vorgang erstellte und verwendete temporäre Datei wird von PHP automatisch gelöscht.

    – RiggsFolly

    10. Oktober 2014 um 9:19 Uhr

Sie können verwenden deleteFileAfterSend http://laravel.com/docs/5.0/responses#other-responses

return response()->download($filePath, $fileName, $headers)->deleteFileAfterSend(true);

  • Siehe @cbloss793 Kommentar unten “Das funktioniert in Laravel 4.2. Platzieren Sie es einfach im Controller anstelle von app/start/global.php.”

    – Jon

    10. November 2015 um 5:41 Uhr

  • DeleteFileAfterSend(true) funktioniert auch hervorragend auf Laravel 5.3. Obwohl die Dokumentation nichts darüber aussagt, können Sie es trotzdem verwenden. Vielleicht wird es bald verworfen.

    – NielsKoole

    8. November 2016 um 14:08 Uhr

  • Beachten Sie, dass deleteFileAfterSend(true) ist eigentlich ein Symfony-Feature (Teil von HttpFoundation), die anscheinend hinzugefügt wurde 2014.

    – Jonathan

    23. Dezember 2016 um 13:42 Uhr

  • Nett! Dies funktioniert sogar beim Streamen einer Datei, dh return response()->file(...)->deleteFileAfterSend(true);

    – Tyler Collier

    11. März 2021 um 23:55 Uhr

  • Danke vielmals! 7 Jahre später und du hast mir immer noch geholfen! Ich frage mich, warum das aus den Laravel-Dokumenten entfernt wurde?!

    – mniess

    18. Februar um 12:17 Uhr

Benutzer-Avatar
Matt Burrow

Ich persönlich verwende Folgendes;

$response = Response::make(file_get_contents($path_to_file), $status_code, $headers);

Der Statuscode ist offensichtlich der Code, den Sie zurückgeben möchten.

Innerhalb des Parameters $header können Sie ein Array mit den Indizes Content-Type und Content-Disposition übergeben.

Dann können Sie einfach $path_to_file aufheben und $response zurückgeben.


Eine viel einfachere Möglichkeit zum Löschen einer Datei wäre die Verwendung von Jons Antwort für Versionen von Laravel> 4.0.

Sie können verwenden deleteFileAfterSend http://laravel.com/docs/5.0/responses#other-responses

return response()->download($filePath, $fileName, $headers)->deleteFileAfterSend(true);

  • Hat für mich funktioniert. Danke vielmals!

    – Deepak

    30. Dezember 2020 um 5:49 Uhr

Benutzer-Avatar
Rahat Rahat

Verwenden Sie einfach diese Codezeile:

return response()->download($file_path)->deleteFileAfterSend(true);

Hier wird innerhalb der Download-Funktion der Dateipfad als Argument übergeben. Nehmen wir als Beispiel an, Sie möchten Ihre Datenbank in einer Datei sichern und beim Herunterladen auch löschen:

$date = Carbon::now()->format('Y-m-d_h-i');
$pub_path = public_path();
$file_path = $pub_path . '/application/db_backups/' . $date . '.sql';
$output = shell_exec('mysqldump -h58.84.34.65 -uwsit -pwsit97480 websms > ' . $file_path);
return response()->download($file_path)->deleteFileAfterSend(true);

  • Nur-Code-Antworten sind für andere nicht immer leicht zu verstehen. Es wäre großartig, wenn Sie einen kurzen Kommentar dazu hinzufügen könnten, wie Ihr Vorschlag das Problem des OP löst

    – Simas Joneliunas

    27. Januar 2020 um 4:50 Uhr

Wenn Sie die Quelldatei nach dem Herunterladen löschen möchten, schreiben Sie sie einfach wie folgt

return response()->download($filePath)->deleteFileAfterSend(true);

Benutzer-Avatar
juniorb2s

$filename = storage_path() . '/testing.txt';

App::finish(function($request, $response) use ($filename)
{
    unlink($filename);
});

return Response::download($filename);

  • Versuchen Sie, Ihre Antwort zu erklären.

    – Glatter Geek

    8. April 2015 um 19:29 Uhr

  • Dies funktioniert in Laravel 4.2. Legen Sie es einfach in den Controller anstelle der app/start/global.php. Brillant!

    – cbloss793

    26. Oktober 2015 um 19:15 Uhr

  • Nicht verwenden, wenn Sie Laravel > 5.0 haben

    – CommandZ

    19. April 2016 um 18:28 Uhr

  • Ich zweite @CommandZ, verwende Jons obige Methode für jede Version 5 und höher.

    – cbloss793

    26. September 2016 um 22:29 Uhr

Benutzer-Avatar
J.Hpour

Zum Laravel 5.8 verwenden streamen herunterladen. Löschen Sie in der Callback-Funktion die Datei, nachdem Sie den Inhalt wiedergegeben haben.

Schauen wir uns die Lösung an:


return response()->streamDownload(function () use ($pathToTheFile) {
    echo Storage::get($pathToTheFile);
    Storage::delete($pathToTheFile);
}, 'my-awesome-file-name');

Ich weiß nicht, ob es für die älteste oder die neueste Version funktioniert.

  • Versuchen Sie, Ihre Antwort zu erklären.

    – Glatter Geek

    8. April 2015 um 19:29 Uhr

  • Dies funktioniert in Laravel 4.2. Legen Sie es einfach in den Controller anstelle der app/start/global.php. Brillant!

    – cbloss793

    26. Oktober 2015 um 19:15 Uhr

  • Nicht verwenden, wenn Sie Laravel > 5.0 haben

    – CommandZ

    19. April 2016 um 18:28 Uhr

  • Ich zweite @CommandZ, verwende Jons obige Methode für jede Version 5 und höher.

    – cbloss793

    26. September 2016 um 22:29 Uhr

Benutzer-Avatar
Jayakarthik Appasamy

unlink('./path/filename.extension');

  • Es wäre schön, wenn Sie Ihrer Antwort eine kleine Erklärung hinzufügen könnten, nicht nur einen Einzeiler

    – GNi33

    10. Oktober 2014 um 10:10 Uhr

  • In der Frage gibt er die Antwort zurück. Dieser Code würde niemals ausgeführt werden.

    – Matthias

    30. Januar 2015 um 10:07 Uhr

1019770cookie-checkLöschen von Dateien nach dem Download in Laravel

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy