Image Intervention с Laravel 5.4 Storage

Я использую фасад хранилища для хранения аватара, который работает нормально, но я хочу изменить размер своего изображения, как в предыдущих версиях laravel.
Как я могу сделать это?
Вот что у меня пока (не работает)

  $path   = $request->file('createcommunityavatar');
$resize = Image::make($path)->fit(300);
$store  = Storage::putFile('public/image', $resize);
$url    = Storage::url($store);

Сообщение об ошибке:

  Command (hashName) is not available for driver (Gd).

14

Решение

Вы пытаетесь передать в putFile неправильный объект. Этот метод ожидает объект File (не Image).

$path   = $request->file('createcommunityavatar');

// returns \Intervention\Image\Image - OK
$resize = Image::make($path)->fit(300);

// expects 2nd arg - \Illuminate\Http\UploadedFile - ERROR, because Image does not have hashName method
$store  = Storage::putFile('public/image', $resize);

$url    = Storage::url($store);

Хорошо, теперь, когда мы понимаем основную причину, давайте исправим код

// returns Intervention\Image\Image
$resize = Image::make($path)->fit(300)->encode('jpg');

// calculate md5 hash of encoded image
$hash = md5($resize->__toString());

// use hash as a name
$path = "images/{$hash}.jpg";

// save it locally to ~/public/images/{$hash}.jpg
$resize->save(public_path($path));

// $url = "/images/{$hash}.jpg"$url = "/" . $path;

Представим, что вы хотите использовать Storage фасад:

// does not work - Storage::putFile('public/image', $resize);

// Storage::put($path, $contents, $visibility = null)
Storage::put('public/image/myUniqueFileNameHere.jpg', $resize->__toString());
15

Другие решения

Я делаю это так:

  1. Изменить размер и сохранить изображение где-нибудь (например, в общей папке).
  2. Создайте новый файл и передайте его функциям файловой системы Laravel (например, putFileAs).
  3. Удалить временный файл вмешательства

Примечание. Конечно, вы можете изменить его в соответствии с вашими потребностями.

$file = $request->file('portfolio_thumb_image');

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

$image->resize(570, 326, function ($constraint) {
$constraint->aspectRatio();
});

$thumbnail_image_name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME).'.'.$file->getClientOriginalExtension();

$image->save(public_path('images/'.$thumbnail_image_name));

$saved_image_uri = $image->dirname.'/'.$image->basename;

//Now use laravel filesystem.
$uploaded_thumbnail_image = Storage::putFileAs('public/thumbnails/'.$portfolio_returned->id, new File($saved_image_uri), $thumbnail_image_name);

//Now delete temporary intervention image as we have moved it to Storage folder with Laravel filesystem.
$image->destroy();
unlink($saved_image_uri);
3

положил Метод работает с выводом изображения Image.
putFile Метод принимает экземпляр Illuminate \ Http \ File или Illuminate \ Http \ UploadedFile.

$photo = Image::make($request->file('photo'))
->resize(400, null, function ($constraint) { $constraint->aspectRatio(); } )
->encode('jpg',80);

Storage::disk('public')->put( 'photo.jpg', $photo);

Приведенный выше код изменяет размер загруженного файла до ширины 400 пикселей, сохраняя соотношение сторон. Затем кодирует в JPG с качеством 80%.
Затем файл сохраняется на общедоступном диске.
Обратите внимание, что вы должны указать имя файла, а не только каталог.

2

Обязательно добавьте use Illuminate\Http\File; в начало вашего файла, чтобы это работало, и прочитайте раздел документации Автоматическая трансляция.

Это предполагает, что вы хотите все JPEG

$path   = $request->file('createcommunityavatar');
$resize = Image::make($path)->fit(300)->encode('jpg');
$filePath = $resize->getRealPath() . '.jpg';
$resize->save($filePath);
$store  = Storage::putFile('public/image', new File($resize));
$url    = Storage::url($store);

Вот как я делаю это в моем приложении с комментариями, чтобы помочь

// Get the file from the request
$requestImage = request()->file('image');

// Get the filepath of the request file (.tmp) and append .jpg
$requestImagePath = $requestImage->getRealPath() . '.jpg';

// Modify the image using intervention
$interventionImage = Image::make($requestImage)->resize(125, 125)->encode('jpg');

// Save the intervention image over the request image
$interventionImage->save($requestImagePath);

// Send the image to file storage
$url = Storage::putFileAs('photos', new File($requestImagePath), 'thumbnail.jpg');

return response()->json(['url' => $url]);
1

Попробуйте обновить расширение GD для текущей версии php.

Если это не поможет, попробуйте сохранить изображение с измененным размером на локальном диске и использовать Storage :: putFile.

Вы можете удалить файл, как только он будет загружен в ваш путь хранения.

Второй параметр вашего метода putFile — это экземпляр класса Image Intervention. Вы должны передать это как второй параметр методу putFile.

$resize->save($absolutePath . 'small/' . $imageName);
0

Вы не можете хранить объект \ Intervention \ Image \ Image непосредственно в файловой системе Laravel 5. Что вы можете сделать, это изменить размер изображения из вашего запроса и сохранить его по тому же пути TMP. Затем просто сохраните загруженный (перезаписанный) файл в файловую систему.

Код:

$image  = $request->file('createcommunityavatar');
//resize and save under same tmp path
$resize = Image::make($image)->fit(300)->save();
// store in the filesystem with a generated filename
$store  = $image->store('image', 'public');
// get url from storage
$url    = Storage::url($store);
0

Я сделал это следующим образом, это просто и без путаницы:

//Get file
$path= $request->file('createcommunityavatar');

// Resize and encode to required type
$img = Image::make($file)->fit(300)->encode('jpg');

//Provide own name
$name = time() . '.jpg';

//Put file with own name
Storage::put($name, $img);

//Move file to your location
Storage::move($name, 'public/image/' . $name);
0
По вопросам рекламы [email protected]