服务 PHP 图像资源作为 Laravel 中的响应

Serving PHP image resource as response in Laravel

我正在开发一个网络应用程序。在我的应用程序中,我需要处理一些图像并将其显示在浏览器上。但我没有将图像保存为文件并从路径访问文件。我出于某种原因没有这样做。相反,我从某种字节数据创建一个图像资源,然后提供它。

这是我在控制器中的代码。

function serveS3Image(Request $request)
{
    $image_data = Storage::disk('s3')->get($request->get('identifier'));
    $data = imagecreatefromstring($image_data);
    header('Content-Type: image/png');
    imagepng($data);
}

当我从浏览器访问操作时,它显示正确的图像。但我想以更多 Laravel 的方式来做。像这样:

function serveS3Image()
{
     return Response::ImageResource($data);
}

如何return PHP 图片资源?

https://laravel.com/docs/5.5/responses#file-responses

文件方法可用于直接在用户浏览器中显示文件,例如图像或 PDF,而不是启动下载。

此方法接受文件路径作为第一个参数,headers 数组作为第二个参数:

return response()->file($pathToFile);

return response()->file($pathToFile, $headers);

我在 Laracast 上发现了和你一样的问题。 看看this thread。希望对你有所帮助。

编辑: 从 laracast 添加代码

public function downloadAsset($id)
{
    $asset = Asset::find($id);
    $assetPath = Storage::disk('s3')->url($asset->filename);

    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=" . basename($assetPath));
    header("Content-Type: " . $asset->mime);

    return readfile($assetPath);
}

最后,我根据一些答案得到了解决方案。我只需要这样return。

return response(Storage::disk('s3')->get($request->get('identifier')))->header('Content-Type', 'image/png');

在响应中,我传递了图像数据,而不是文件路径。然后我在 header 中设置内容类型。谢谢大家。