Larvel下载文件执行失败
现在有个需求是导出文件,后台逻辑这边是写入文件,写入完后执行return response()->download()
下载到用户机上,但是由于导出时间可能比较长,在这个时间段内用户是不能进行其他操作的,为了进行优化,随即将导出逻辑放到异步队列里,但是在队列里不能执行return response()->download()
,虽然想到了监听这个队列是否完成,即是否已经写入文件了,如果写入文件了就return response()->download()
,所以用到了laravel的任务事件,但是任务事件执行逻辑是一个闭包,在闭包里执行return response()->download()
一样是无效的,本人新手一枚,各位大神有其他方案或更好的想法吗。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
? 你这是个错误的队列使用方式呐。
1、当用户点击导出时,在后台生成一个 taskId ,然后传递给队列。
2、把 taskId 返回个客户端,客户端使用 taskId 轮询一个查询是否生成成功的接口。
3、队列中文件生成成功后,把下载地址放进相应的 taskId 。
4、客户端查到完成后,拿到下载地址,提醒用户转到下载页面进行下载。
其实把用户逻辑拆成两部就好了,我们之前又个和你这比较接近的业务场景,要给商家生产报表内服务,生产报表需要离线分析系统,所以时间比较长,但是并不是所有商家都会要这个报表.所以商家后台报表服务就变成了商家请求生成报表,将报表生成请求丢入队列,页面显示生成中,提示大概多长时间后来下载,后续进入页面只要报表没生存好都是提示生成中,生成完毕后页面才会显示下载地址
按你设计,前半部分就已经对了,后半部分想队列里返回下载就错了,应该是队列里把生成好的文件地址写入存储或者数据库,通知或者不通知用户都行,但是要用户自己来下载就好,当然你用邮件附件或者链接发给用户也可以