Laravel + Image Intervention:强制下载未保存的文件

2023-12-20

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

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

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

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

显示的代码片段结果是

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

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

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


尝试这个:

$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);

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

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

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

我希望这有帮助。

Edit:Laravel 的后续版本引入了deleteFileAfterSend()响应对象上的方法。如果您同意将文件临时保存到服务器,您可以执行以下操作:

return response()->download($path)->deleteFileAfterSend();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel + Image Intervention:强制下载未保存的文件 的相关文章

随机推荐