Laravel +图像干预:强制下载未保存的文件

问题描述 投票:2回答:1

我想简单地上传文件,调整大小,然后强制下载每个上传的文件。我不想保存文件。

调整大小等工作正常,但我无法强制下载新文件。

$content = $image->stream('jpg');

return response()->download($content, $name);

显示的片段会导致

is_file()期望参数1是有效路径,给定字符串

很可能是因为$ content不是路径而是实际数据。

有没有办法强制下载而不先保存它?

laravel laravel-5 laravel-5.4 intervention
1个回答
4
投票

试试这个:

$url = "https://cdn.psychologytoday.com/sites/default/files/blogs/38/2008/12/2598-75772.jpg";
$name = 'happy.jpg';

$image = Image::make($url)->encode('jpg');
$headers = [
    'Content-Type' => 'image/jpeg',
    'Content-Disposition' => 'attachment; filename='. $name,
];
return response()->stream(function() use ($image) {
    echo $image;
}, 200, $headers);

这就是我们正在做的事情。我们正在使用Intervention Image将该图像编码为正确的文件类型格式。然后我们自己设置浏览器标题,告诉浏览器它是什么类型的文件,我们希望浏览器将其视为可下载的附件。最后,我们使用Laravel的stream()方法返回响应并使用闭包。我们告诉闭包它可以使用use ($image)访问图像的编码数据,然后我们简单地将原始数据回显到页面上。从那里我们告诉浏览器HTTP代码是200(OK),然后给它我们的标题告诉浏览器该做什么。

你的问题是Laravel方便的download()方法期望它是文件系统上的文件。所以我们必须自己流式传输并手动设置标头。

您将需要编写一些额外的代码来处理encode()方法的不同文件扩展名干预使用以及返回的Content-Type。你可以找到所有可用的mime类型here列表。

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.