Larvel下载文件执行失败

现在有个需求是导出文件,后台逻辑这边是写入文件,写入完后执行return response()->download()下载到用户机上,但是由于导出时间可能比较长,在这个时间段内用户是不能进行其他操作的,为了进行优化,随即将导出逻辑放到异步队列里,但是在队列里不能执行return response()->download(),虽然想到了监听这个队列是否完成,即是否已经写入文件了,如果写入文件了就return response()->download(),所以用到了laravel的任务事件,但是任务事件执行逻辑是一个闭包,在闭包里执行return response()->download()一样是无效的,本人新手一枚,各位大神有其他方案或更好的想法吗。
1596353164(1).jpg
1596353224(1).jpg

阅读 115
评论
    2 个回答

    😂 你这是个错误的队列使用方式呐。

    1、当用户点击导出时,在后台生成一个 taskId ,然后传递给队列。
    2、把 taskId 返回个客户端,客户端使用 taskId 轮询一个查询是否生成成功的接口。
    3、队列中文件生成成功后,把下载地址放进相应的 taskId 。
    4、客户端查到完成后,拿到下载地址,提醒用户转到下载页面进行下载。

      • 1.8k

      其实把用户逻辑拆成两部就好了,我们之前又个和你这比较接近的业务场景,要给商家生产报表内服务,生产报表需要离线分析系统,所以时间比较长,但是并不是所有商家都会要这个报表.所以商家后台报表服务就变成了商家请求生成报表,将报表生成请求丢入队列,页面显示生成中,提示大概多长时间后来下载,后续进入页面只要报表没生存好都是提示生成中,生成完毕后页面才会显示下载地址
      按你设计,前半部分就已经对了,后半部分想队列里返回下载就错了,应该是队列里把生成好的文件地址写入存储或者数据库,通知或者不通知用户都行,但是要用户自己来下载就好,当然你用邮件附件或者链接发给用户也可以

        撰写回答

        登录后参与交流、获取后续更新提醒