Laravel 响应:返回图片流 2 个改进

问题

我不想让用户知道图片的真实 URL,那么如何在响应中返回图片流,即返回的不是一个浏览器可直接下载的图片文件 URL,而是图片的字节流?

回答

如果不想让用户知道图片(或其它类型的文件)的真实 URL,直接返回文件的字节流,可以使用 stream方法。这个方法接受回调、可选的状态码和头信息数组作为参数,见下面的示例代码:

Route::get('/pic', function () {
    $fullPath = base_path().DIRECTORY_SEPARATOR.'pic'.DIRECTORY_SEPARATOR.'demo.jpg';

    return response()->stream(function () use ($fullPath) {
        echo file_get_contents($fullPath);
    }, 200, ['Content-Type' => 'image/jpeg']);
});

上面的代码在 stream 方法的回调函数中,直接输出保存在项目根目录的 pic 子目录中的 demo.jpg 的内容, 在第三个参数中设置响应标头的 Content-Typeimage/jpeg,如果 Content-Type 设置不正确,则浏览器显示的会是乱码。

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 2

请问如何通过函数的形式应用到blade模板里面使用呢?

function imgStream($img)
{
    $fullPath = base_path().DIRECTORY_SEPARATOR.'pic'.DIRECTORY_SEPARATOR.$img;

    return response()->stream(function () use ($fullPath) {
        echo file_get_contents($fullPath);
    }, 200, ['Content-Type' => 'image/jpeg']);
}

改成这样的函数,但是不行……

2年前 评论
Im_Chris 2年前

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