我把所有上传的文件保存在一个自定义的外部驱动器上。这些文件是通过自定义API存储的。
在Laravel 5.2中,我可以对本地文件执行以下操作以下载它:
return response()->download('path/to/file/image.jpg');
不幸的是,当我传递URL而不是路径时,Laravel会抛出一个错误:
文件https://my-cdn.com/files/image.jpg不存在
(the URL当然是一个哑元)。
有没有什么方法可以让我使用Laravel的实现下载image.jpg文件,或者我可以使用普通的PHP来下载?
8条答案
按热度按时间g9icjywg1#
这并不奇怪,您应该使用
copy()
函数下载外部映像,然后在响应中将其发送给用户:b1uwtaje2#
TL;DR
如果您使用的是5.6或更高版本,请使用streamDownload响应。否则,请实现下面的函数。
原始答案
与“download”响应非常相似,Laravel有一个“stream”响应,可以用来实现这一点。看看API,这两个函数都是围绕Symfony的BinaryFileResponse和StreamedResponse类的 Package 器。在Symfony文档中,他们有很好的示例来说明如何创建StreamedResponse
下面是我使用Laravel的实现:
2018年1月17日更新
现在它是merged into Laravel 5.6,并且已经被添加到5.6文档中。streamDownload响应可以这样调用:
piah890a3#
至于2020年,这一切都很容易。
2行代码用于下载到服务器,2行代码用于上传到浏览器(如果需要)。
假设您希望将Google主页的HTML保存到本地服务器上,然后返回HTTP响应以启动浏览器在客户端下载文件幻灯片:
有关磁盘配置和
put
方法的详细信息,请查找Laravel Storage Facade文档;有关使用HTTP响应返回文件的“使用文件下载响应”文档,请查找。qco9c6ql4#
为什么不使用简单的重定向呢?
2ekbmq325#
请尝试以下脚本:
如果您不想让终端用户看到标题中的main_url,请尝试以下操作:
ssgvzors6#
对我来说,这里的一个关键是能够测试代码。使用Laravel较新的https://laravel.com/docs/8.x/http-client,我可以这样使用它
如下所示获取文件并保存
然后在测试中模仿它
wyyhbhjk7#
您可以使用
download()
方法使用浏览器提供要下载的文件文件:
示例:
djmepvbi8#
您可以下拉原始文件的内容,计算出其mime类型,然后制作自己的响应,给出正确的头。
我自己使用PDF库来完成此操作,但您可以修改为使用
file_get_contents()
来下拉远程资源:您需要将
$pdf
更改为文件的数据,将Content-Type
更改为包含数据所在文件的MIME类型,将Content-Disposition
更改为您希望它显示为的文件名。不知道这是否会工作,我的只是使浏览器弹出一个PDF下载,所以我不知道它是否会工作嵌入CDN文件...值得一试。