Laravel 响应:流式下载 Draft 1 个改进

问题

在控制器或路由中是否可以实现流式下载,即将某操作返回的字符串内容直接转换为下载响应。而不需要先保存至磁盘中?

回答

使用 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');
});

流式下载

注意:要实现流式下载,在调用这个方法时必须指定第二个文件名参数,否则内容会直接显示在浏览器中,而不是下载。

参考

本 Wiki 尚未完善,邀您参与 如何撰写一篇高品质的 Wiki?
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!