Использование Laravel 5.8
У меня была аналогичная проблема при попытке прочитать файл изображения с помощью Image
, когда этот файл был сохранен и загружен с помощью Storage
.
Кроме того все ответы я не был уверен, почему это не работает.
Исключение, когда Image
пытался прочитать файл
Intervention\Image\Exception\NotReadableException : невозможно выполнить инициализацию из заданных двоичных данных.
Краткий ответ
Добавление ->encode()
решило проблему
http://image.intervention.io/api/encode
Сценарий
В общем, у меня был такой тест
Storage::fake();
$photo = factory(Photo::class)->create();
$file = \Image::make(
UploadedFile::fake()->image($photo->file_name, 300, 300)
);
Storage::disk($photo->disk)
->put(
$photo->fullPath(),
$file
);
И в контроллере у меня было что-то вроде этого
return \Image::make(
Storage::disk($photo->disk)
->get(
$photo->fullPath()
)
)->response();
Решение
После расследования я понял, что любой файл, созданный Image
и сохраненный Storage
, имеет размер 0 октетов. Посмотрев все решения из этого поста и несколько часов спустя, я заметил, что все используют encode()
, но никто не упомянул, что это было именно так. Так что я попробовал, и это сработало.
Если присмотреться еще немного, Image
на самом деле кодирует под капотом перед сохранением. https://github.com/Intervention/image/blob/master/src/Intervention/Image/Image.php#L146
Итак, мое решение состояло в том, чтобы просто сделать это
$file = \Image::make(
\Illuminate\Http\UploadedFile::fake()->image('filename.jpg', 300, 300)
)->encode();
\Storage::put('photos/test.jpg', $file);
можно проверить в Tinker. Будет создано черное изображение
person
Clément Baconnier
schedule
28.06.2019
Command (hashName) is not available for driver (Gd).
- person wizardzeb   schedule 13.10.2016imagick
не помогла. Теперь я получаюCommand (hashName) is not available for driver (Imagick).
- person dbr   schedule 13.11.2016