【问题标题】:Laravel + Image Intervention : Force download of file that is not savedLaravel + Image Intervention:强制下载未保存的文件
【发布时间】:2019-12-20 02:44:12
【问题描述】:

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

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

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

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

显示的sn-p结果

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

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

有没有办法在不先保存的情况下强制下载?

【问题讨论】:

  • 下载后不能暂时保存文件删除吗?
  • 这是一个选项,但在我的选项中它并不是很干净 - 但是,谢谢你的想法:)
  • @Christophvh 你不必在 Laravel 上这样做。

标签: laravel laravel-5 laravel-5.4 intervention


【解决方案1】:

试试这个:

$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

我希望这会有所帮助。

编辑: Laravel 的更高版本在响应对象上引入了deleteFileAfterSend() 方法。如果您可以暂时将文件保存到服务器,您可以这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2017-11-24
    • 2021-09-09
    • 1970-01-01
    • 2014-09-01
    • 2018-03-13
    相关资源
    最近更新 更多