【问题标题】:Deleting files after download in laravel在laravel中下载后删除文件
【发布时间】:2014-12-05 09:54:13
【问题描述】:

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

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

这意味着函数在返回时结束,我无法删除文件。我试图在路由上调用“后”过滤器,但文件很快被删除。

有什么想法吗?

【问题讨论】:

  • 您的意思是要删除 PHP 创建的临时文件,还是您刚刚下载并放在文件系统中某个位置的文件。因为PHP在下载过程中创建和使用的临时文件被PHP自动删除了。

标签: php laravel


【解决方案1】:

我个人使用以下;

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

状态码显然是你要返回的代码。

在 $header 参数中,您可以传递索引为 Content-Type 和 Content-Disposition 的数组。

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


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

你可以使用deleteFileAfterSendhttp://laravel.com/docs/5.0/responses#other-responses

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

【讨论】:

  • 为我工作。非常感谢!
【解决方案2】:
unlink('./path/filename.extension');

【讨论】:

  • 如果你能在你的答案中添加一点解释,而不仅仅是一个简单的解释,那就太好了
  • 在问题中他返回了响应。这段代码甚至永远不会运行。
【解决方案3】:
$filename = storage_path() . '/testing.txt';

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

return Response::download($filename);

【讨论】:

  • 试着解释你的答案。
  • 这适用于 Laravel 4.2。只需将其放入控制器而不是 app/start/global.php。太棒了!
  • 如果你有 laravel > 5.0,请不要使用
  • 我第二个@CommandZ,对任何版本 5 及更高版本使用上述 Jon 的方法。
【解决方案4】:

你可以使用deleteFileAfterSendhttp://laravel.com/docs/5.0/responses#other-responses

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

【讨论】:

  • 查看@cbloss793 下方的评论“这适用于 Laravel 4.2。只需将它放在控制器中,而不是 app/start/global.php 中。”
  • DeleteFileAfterSend(true) 在 Laravel 5.3 上也很有效。尽管文档没有说明任何内容,但您仍然可以使用它。也许它很快就会被弃用。
  • 请注意,deleteFileAfterSend(true) 实际上是 Symfony 的一项功能(HttpFoundation 的一部分),它似乎已添加到 2014
  • 不错!这甚至在流式传输文件时也有效,即return response()->file(...)->deleteFileAfterSend(true);
  • 非常感谢! 7年过去了,你还是帮了我!我想知道为什么这会从 Laravel 文档中删除?!
【解决方案5】:

只需使用这行代码:

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);

【讨论】:

  • 只有代码的答案对其他人来说并不总是容易理解的。如果您可以就您的提案如何解决 OP 的问题添加简短评论,那就太好了
【解决方案6】:

如果下载后要删除源文件,直接写成如下

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

【讨论】:

    【解决方案7】:

    对于Laravel 5.8,请使用stream download。在回调函数中,回显内容后删除文件。

    我们来看看解决方案:

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

    我不知道它适用于最旧的版本还是最新的版本。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      相关资源
      最近更新 更多