Lumen在下载完成后的回调函数

3

我在/app/Http/routes.php中添加了以下代码,创建了一个下载路由,我的客户成功地通过该路由下载文件:

$app->get('/dl', function() use ($app){
    return response()->download(getcwd() . "/targetfile");
});

现在我希望在给定get请求的实例完成文件传输后执行回调。我应该怎么做?

更具体地说,我想在文件下载完成后删除文件,但以下代码不起作用:

$app->get('/dl', function() use ($app){
    unlink(getcwd() . "/targetfile");
    return response()->download(getcwd() . "/targetfile");
});
2个回答

2

原问题的答案

为了在响应被发送后有一个“回调”,您需要使用所谓的“可终止”中间件。

要使中间件可终止:

1)它必须是全局的;即使用中间件函数而不是routeMiddleware进行注册。

$app->middleware([
    App\Http\Middleware\Myterminable::class
]);

2) 它必须有一个名为'terminate ($request, $response)'的方法。这个方法在响应发送后将被调用。

public function terminate($request, $response)
{
    // your code here
}

另一个选择

全局中间件似乎会浪费计算资源,因为每个请求/响应对都要调用它,所以我查看了Lumen的代码,并发现下载方法实际上返回一个实例。

Symfony\Component\HttpFoundation\BinaryFileResponse;

在我所称之处

deleteFileAfterSend(true); 

这有助于实现我的最初目标。

return response()->download(getcwd() . "/targetfile")->deleteFileAfterSend(true);

0

我已经尝试过了。如果你仔细查看你提供的页面,你会注意到在调用 after 中间件之前实际上并没有发送该响应。出于明显的原因,我不想在文件可用之前将其取消链接,我在问题中也提到了这一点。 - qwertyzw
我有什么遗漏吗?如果我这样做,所有我得到的都是一个失败的状态。 - qwertyzw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接