Laravel 5.5 – Обработка PostTooLargeException для большого изображения base64?

У меня есть ограничение в 10 МБ для каждого изображения, и все, что больше, должно препятствовать выполнению кода. Я не уверен, как это сделать. Вот что я пробовал:

В методе контроллера:

// 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);

Вышеприведенное отлично работает с маленькими изображениями, но проблема связана с большими изображениями. Я хочу как можно раньше определить, что размер превышает ограничение в 10 МБ, чтобы не тратить память/время обработки и просто возвращать пользователю ошибку о том, что изображение превышает допустимый размер файла.

Когда я отправляю изображение размером 100 МБ в формате base64, Laravel выдает ошибку PostTooLargeException, поскольку, конечно, размер сообщения base64 огромен. Итак, как я могу определить, что фактическое изображение превышает ограничение в 10 МБ, и вернуть пользователю изящную ошибку, если это так?


person Wonka    schedule 20.09.2017    source источник


Ответы (2)


Эта строка:

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

создает ресурс изображения, и когда вы приводите его к строке, он дает вам пустой.

Вам нужно получить длину фактической строки, например:

$image_size = strlen($base64_image);

и проверьте, больше ли он 10 МБ.

person José A. Zapata    schedule 22.09.2017

По общему мнению, представление base64 составляет около 135% исходного изображения. Это можно изменить, если строка сжата gzip.

Используйте пару изображений и преобразуйте их в base64 с gzip и feom или без них, которые вычисляют процент отклонения.

person nilobarp    schedule 22.09.2017
comment
Да, я столкнулся с этим, но я пытаюсь решить проблему в Laravel именно из-за исключения. В основном обнаружение PostTooLargeException в Laravel для этого изображения и ответ изящной ошибкой. - person Wonka; 22.09.2017