Intervention Image + Laravel's File Storage: Store resized/decoded base64 image (Intervention Image encode() doesn't work)
-
我正在使用Croppie jQuery插件,该插件返回以base64编码的裁剪图像。
-
提交表单后(裁剪图像以base64编码)-我使用Intervention Image库解码并调整其大小:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public function decodeResizeAndStore(Request $request)
{
$croppie_code = $request->croppie_code;
// https://stackoverflow.com/a/11511605/4437206
if (preg_match('/^data:image\\/(\\w+);base64,/', $croppie_code, $type)) {
$encoded_base64_image = substr($croppie_code, strpos($croppie_code, ',') + 1);
$type = strtolower($type[1]);
$decoded_image = base64_decode($encoded_base64_image);
$resized_image = Image::make($decoded_image)->resize(300, 200);
// AND NOW I WANT TO STORE $resized_image using Laravel filesystem BUT...
}
}
最后,我想使用Laravel的filesytem(文件存储)存储调整大小的图像,这就是我遇到的问题-当我尝试这样做时:
1 | Storage::put($path, (string) $resized_image->encode()); |
...这是行不通的。实际上,它正在正常工作-好像有一些内存泄漏或某些东西,浏览器的选项卡死了,我的RAM和CPU使用率很高...
所以我只是尝试:
1 | dd($resized_image->encode()); |
...是的,这肯定是崩溃的地方-使用encode()方法时。
我不确定为什么会这样,也许是因为我不是在处理标准图片上传,而是在解码的base64下进行?
但是,另一方面,Intervention Image可以从base64以及从解码的base64创建新的图像实例:http://image.intervention.io/api/make
...并且就我而言,这行得通:
1 | $resized_image = Image::make($decoded_image)->resize(300, 200); |
然后,我可以使用save()方法,一切正常。但是我需要使用Laravel的文件存储。
你知道我该怎么办吗?
假设您使用的是最新版本的Laravel(5.7):
您可以像这样使用流方法:
1 2 3 4 | // use jpg format and quality of 100 $resized_image = Image::make($decoded_image)->resize(300, 200)->stream('jpg', 100); // then use Illuminate\\Support\\Facades\\Storage Storage::disk('your_disk')->put('path/to/image.jpg', $resized_image); // check return for success and failure |