Изображение вмешательства + хранилище файлов Laravel: сохранить измененный/декодированный образ base64 (кодирование изображения вмешательства() не работает)

  • Я использую плагин jQuery Croppie, который возвращает обрезанное изображение, закодированное в base64. .

  • После отправки формы (с обрезанным изображением, закодированным в base64) я декодирую и изменяю его размер, используя Библиотека интервенционных изображений:

    public 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 (хранилище файлов), и именно здесь я застрял - когда я пытаюсь это:

Storage::put($path, (string) $resized_image->encode());

... это не работает. На самом деле, что-то работает - похоже, что есть какая-то утечка памяти или что-то в этом роде, вкладка браузера зависает, использование ОЗУ и ЦП увеличивается...

Итак, я только что попробовал:

dd($resized_image->encode());

... и да, именно здесь он определенно дает сбой - при использовании метода encode().

Я не уверен, почему, может быть, это происходит потому, что я работаю не со стандартной загрузкой изображения, а с декодированным base64?

Но, с другой стороны, Intervention Image может создать новый экземпляр изображения из base64, а также из декодированного base64: http://image.intervention.io/api/make ... и в моем случае это работает нормально:

$resized_image = Image::make($decoded_image)->resize(300, 200);

Затем я мог бы использовать метод save(), и все заработало бы нормально. Но мне нужно использовать хранилище файлов Laravel.

Вы знаете, как я могу справиться с этим?


person PeraMika    schedule 11.07.2018    source источник


Ответы (1)


Предполагая, что вы используете последнюю версию Laravel (5.7):

вы можете использовать метод stream следующим образом:

// 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
person Morteza    schedule 20.02.2019