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

Laravel + Image Intervention : Force download of file that is not saved

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

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

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

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

显示的代码段导致

is_file() expects parameter 1 to be a valid path, string given

很可能是因为 $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);

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

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

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

希望对您有所帮助。

编辑: Laravel 的后续版本在响应中引入了 deleteFileAfterSend() 方法 object.如果您可以暂时将文件保存到服务器,您可以这样做:

return response()->download($path)->deleteFileAfterSend();