下载完成时的 Lumen 回调

Lumen callback on completed download

我创建了一个下载路径,我的客户端通过将以下代码添加到 /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");
});

您需要注册一个 after Middleware 并将其应用于您的路线。

Documentation about Middleware

原始问题的答案

因此,为了在发送响应后获得 'callback',您可以使用所谓的 'terminable' 中间件。

为了使中间件可终止:

1) 必须是全局的; I.E 注册了中间件函数而不是 routeMiddleware

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

2) 它必须有方法 'terminate ($request, $response)' 这是发送响应后将调用的方法。

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

另一种选择

全局中间件似乎是对计算资源的浪费,因为它会为每个 request/response 对调用,所以我只是查看了 Lumen 的代码,发现下载方法实际上返回了一个实例

Symfony\Component\HttpFoundation\BinaryFileResponse;

我打电话给

deleteFileAfterSend(true); 

这符合我最初的目标

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