Laravel 响应:流式下载 Draft
问题
在控制器或路由中是否可以实现流式下载,即将某操作返回的字符串内容直接转换为下载响应。而不需要先保存至磁盘中?
回答
使用 streamDownload
方法允许你将字符串响应转换为下载响应,而不需要将其写入磁盘。这个方法接受回调及可选的文件名、头信息数组、disposition 方式作为参数。
streamDownload
方法的源码:
/**
* Create a new streamed response instance as a file download.
*
* @param \Closure $callback
* @param string|null $name
* @param array $headers
* @param string|null $disposition
* @return \Symfony\Component\HttpFoundation\StreamedResponse
*/
public function streamDownload($callback, $name = null, array $headers = [], $disposition = 'attachment')
{
$response = new StreamedResponse($callback, 200, $headers);
if (! is_null($name)) {
$response->headers->set('Content-Disposition', $response->headers->makeDisposition(
$disposition,
$name,
$this->fallbackName($name)
));
}
return $response;
}
示例:
Route::get('/stream', function () {
return response()->streamDownload(function () {
echo file_get_contents("https://github.com/laravel/laravel/blob/master/readme.md");
}, 'laravel-readme.md');
});
注意:要实现流式下载,在调用这个方法时必须指定第二个文件名参数,否则内容会直接显示在浏览器中,而不是下载。
推荐文章: