在laravel中下载后删除文件

vin*_*ent 11 php laravel

我正在创建一个允许用户下载文件的应用程序.下载后我想删除文件.我的代码结束是这样的:

return Response::download(public_path() . '/uploads/_tmp/' . urldecode($filename));
Run Code Online (Sandbox Code Playgroud)

这意味着函数在返回时结束,我无法删除该文件.我试图在路由上调用'after'过滤器,但之后文件会被快速删除.

有任何想法吗?

Jon*_*Jon 33

您可以使用deleteFileAfterSend http://laravel.com/docs/5.0/responses#other-responses

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

  • 请注意,“deleteFileAfterSend(true)”实际上是 Symfony 的一个功能(“HttpFoundation”的一部分),它似乎已在 [2014](https://github.com/symfony/symfony/commit/1fff15864697c6078a74d0a53dab79a5a88803f4) 中添加。 (2认同)

Mat*_*row 22

我个人使用以下内容;

$response = Response::make(file_get_contents($path_to_file), $status_code, $headers);
Run Code Online (Sandbox Code Playgroud)

状态代码显然是您要返回的代码.

在$ header参数中,您可以传递一个包含索引Content-Type和Content-Disposition的数组.

然后你可以简单地取消链接$ path_to_file并返回$ response.


更简单的删除文件的方法是使用Jon的Laravel> 4.0版本的答案.

您可以使用deleteFileAfterSend http://laravel.com/docs/5.0/responses#other-responses

return response()->download($filePath, $fileName, $headers)->deleteFileAfterSend(true);
Run Code Online (Sandbox Code Playgroud)


Ras*_*hat 9

只需使用这行代码:

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

在这里,在下载函数内部,文件路径将作为参数传递。举个例子,您想要将数据库备份到文件中,并且还想通过下载删除:

$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);
Run Code Online (Sandbox Code Playgroud)

  • 仅代码答案并不总是容易被其他人理解。如果您可以添加一个关于您的提案如何解决OP问题的简短评论,那就太好了 (2认同)

小智 9

如果下载后想删除源文件,只需这样写即可

return response()->download($filePath)->deleteFileAfterSend(true);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

return Response::download($filename);
Run Code Online (Sandbox Code Playgroud)

  • 尝试解释你的答案. (2认同)
  • 这适用于Laravel 4.2.只需将它放在控制器而不是app/start/global.php中.辉煌! (2认同)