【问题标题】:Lumen callback on completed download完成下载时的流明回调
【发布时间】:2016-12-02 10:00:28
【问题描述】:

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

【问题讨论】:

    标签: php laravel download response lumen


    【解决方案1】:

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

    Documentation about Middleware

    【讨论】:

    • 我已经试过了。如果您仔细查看您链接的页面,您会注意到在调用 after 中间件之前实际上并未发送该响应。出于显而易见的原因,我不想在文件可用之前取消链接,我在问题中也提到了这一点。
    • 我错过了什么吗?如果我这样做,我得到的只是一个失败的统计数据
    【解决方案2】:

    回答原始问题

    因此,为了在发送响应后进行“回调”,您需要使用所谓的“可终止”中间件。

    为了使中间件可以终止:

    1) 它必须是全局的; IE注册了中间件函数而不是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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2020-06-20
      • 2010-09-14
      • 2021-07-10
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      相关资源
      最近更新 更多