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

Laravel 5.5 - Handling PostTooLargeException for large base64 image?

我接受每张图片的大小限制为 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 限制,以免浪费任何 memory/processing 时间,并且只是 return 向用户提示图像超出允许的文件大小限制的错误。

当我发送一个 100MB 的图像作为 base64 时,Laravel 抛出一个错误 PostTooLargeException,因为 post base64 的大小当然很大。那么我如何才能检测到实际图像超过 10MB 的限制,如果超过了 return 对用户来说是一个优雅的错误?

普遍认为 base64 表示大约是原始图像的 135%。如果字符串是 gzip 压缩的,这可以改变。

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

这一行:

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

创建一个图像资源,当您将其转换为字符串时,它会为您提供一个空字符串。

你需要得到实际字符串的长度,像这样:

$image_size = strlen($base64_image);

并检查它是否大于 10MB。