Laravel 5.5 - 处理大型base64图像的PostTooLargeException?

时间:2017-09-20 15:53:41

标签: laravel-5 intervention

我接受每个图像的限制为10MB,任何更大的都应该阻止执行代码。我不知道该怎么做。这是我试过的:

在控制器方法中:

// Increase memory limit before processing
ini_set('memory_limit','256M');

$base64_image = $request->get('base64_image');
$image = Image::make($base64_image);

// Returns 0, looks like we have to encode image to get file size...
$image_size = strlen((string) $image);
Log::critical('image_size file size from string: ' . $image_size);

$image = $image->encode('jpg');

// Returns byte size
$image_size = strlen((string) $image);
Log::critical('image_size file size from string: ' . $image_size);

以上适用于小图像,但问题在于大图像。我希望尽早检测到大小超过10MB的限制,以免浪费任何内存/处理时间,只是向用户返回错误,使图像超出允许的文件大小限制。

当我发送100MB图像作为base64时,Laravel会抛出错误 PostTooLargeException,因为帖子base64的大小当然很大。那么如何检测到实际图像超过10MB的限制并向用户返回一个优雅的错误呢?

2 个答案:

答案 0 :(得分:1)

这一行:

$image = Image::make($base64_image);

创建一个图像资源,当你把它投射到一个字符串时,它会给你一个空的。

您需要获取实际字符串的长度,如下所示:

$image_size = strlen($base64_image);

并检查它是否大于10MB。

答案 1 :(得分:0)

普遍的共识是base64表示大约是原始图像的135%。如果字符串是gzip,则可以更改此设置。

使用几个图像并将它们转换为base64,使用或不使用gzip和feom来计算偏差百分比。