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

Fra*_*ost 2 laravel laravel-5 intervention laravel-5.4

我只想上传文件,调整大小,然后为每个上传的文件强制下载。我不希望保存的文件。

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

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

return response()->download($content, $name);
Run Code Online (Sandbox Code Playgroud)

所示出的片段的结果在

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

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

有没有强制执行下载而不先保存下载的方法?

Mar*_*ark 6

尝试这个:

$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);
Run Code Online (Sandbox Code Playgroud)

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

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

您将需要编写一些其他代码来处理encode()Intervention使用的方法以及Content-Type返回的文件扩展名。您可以在此处找到所有可用的mime类型的列表。

我希望这有帮助。