Laravel и Intervention / Image: загрузка фотографий в корзину AWS S3 приводит к получению файлов 0 байт - PullRequest
0 голосов
/ 12 марта 2020

Я использую http://image.intervention.io/ с Laravel для изменения размера изображений перед их сохранением в AWS S3. Вот соответствующий код:

$extension = $image->extension();
$realPath = $image->getRealPath();
$resizedImage = Image::make($realPath) // ->resize(255, 255); // resize or not, make() seems to always return an empty Image
$file_path = "posts/$post->id/images/image-$post->id-num-$pictureCount.$extension/"; 
$path = Storage::disk('s3')->put($file_path, $resizedImage->__toString(), ['visibility' => 'public']);

При отладке (установлена ​​точка останова на строке $path), я вижу, что $realPath содержит значение, подобное /private/var/folders/23/jl2dytp168g9g9s5j51w2m780000gn/T/php9047Fh - и, переходя туда, я вижу изображение, которое я пытаюсь make() / resize().

Объект $resizedImage имеет следующие поля:

[encoded] => 
[mime] => image/jpeg
[dirname] => /private/var/folders/23/jl2dytp168g9g9s5j51w2m780000gn/T
[basename] => phpTNRdXe
[extension] => 
[filename] => phpTNRdXe

Я предполагаю, что закодированное свойство должно хранить что-то вроде данных образа base 64?

При проверке изображения в AWS S3-корзине оно всегда загружается как изображение с 0 байтами. Что я здесь не так делаю?

Вмешательство настроено на использование GD, если оно имеет какое-либо значение

1 Ответ

1 голос
/ 15 марта 2020

Laravel Класс файла является подклассом Symfony Класс файла , который, в свою очередь, подклассов \ SplFileInfo

Файловый объект может быть передан непосредственно в Image::make. Image::make получает realPath для \SplFileInfo объектов.

Image :: make возвращает экземпляр Image , а $resizedImage->__toString() возвращает значение его encoded поле. encoded начинается как пустая строка .

Изображение должно быть закодировано перед доступом к его закодированному значению.

$resizedImage->encode();

Тогда

$path = Storage::disk('s3')->put($file_path, $resizedImage->__toString(), ['visibility' => 'public']);
...