TL;DR
如果您使用的是 5.6 或更高版本,请使用 streamDownload 响应。否则,请实现以下函数。
原始答案
与“下载”响应非常相似,Laravel有一个“流”响应,可用于执行此操作。看看API,这两个函数都是围绕Symfony的BinaryFileResponse和StreamedResponse类的包装器。在Symfony文档中,他们有关于如何创建StreamedResponse的很好的例子。
以下是我使用Laravel的实现:
<?php
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
Route::get('/', function () {
$response = response()->stream(function () {
echo file_get_contents('http://google.co.uk');
});
$name = 'index.html';
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$name,
str_replace('%', '', Str::ascii($name))
);
$response->headers->set('Content-Disposition', $disposition);
return $response;
});
更新 2018-01-17
它现在已经合并到Laravel 5.6中,并已添加到5.6文档中。streamDownload 响应可以按如下方式调用:
<?php
Route::get('/', function () {
return response()->streamDownload(function () {
echo file_get_contents('https://my.remote.com/file/store-12345.jpg');
}, 'nice-name.jpg');
});