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();
我只想上传文件,调整它们的大小,然后强制下载每个上传的文件。我不想保存文件。
调整大小等工作正常,但我无法强制下载新文件。
$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();