我想简单地上传文件,调整大小,然后强制下载每个上传的文件。我不想保存文件。
调整大小等工作正常,但我无法强制下载新文件。
$content = $image->stream('jpg');
return response()->download($content, $name);
显示的代码段显示
is_file()期望参数1是有效路径,给定字符串
很可能因为$ content不是路径而是实际数据。
有没有办法在不先保存下载的情况下强制执行下载?
答案 0 :(得分: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);
这是我们正在做的事情。我们正在使用干预图像将该图像编码为正确的文件类型格式。然后我们自己设置浏览器标题,告诉浏览器它是什么类型的文件,我们希望浏览器将其视为可下载的附件。最后,我们使用Laravel的stream()
方法返回响应并使用闭包。我们告诉闭包它可以使用use ($image)
访问图像的编码数据,然后我们简单地将原始数据回显到页面上。从那里我们告诉浏览器HTTP代码是200(OK),然后给它我们的标题告诉浏览器该做什么。
你的问题是Laravel的方便download()
方法期望它是文件系统上的文件。所以我们必须自己流式传输并手动设置标题。
您需要编写一些额外的代码来处理干预使用的encode()
方法的不同文件扩展名以及返回的Content-Type
。您可以找到所有可用的mime类型列表here。
我希望这会有所帮助。