Источник изображения, недоступный для чтения в Laravel 5.2 - Intervention Image
У меня есть небольшая проблема относительно процесса изменения размера данного изображения, я пытаюсь отправить форму, содержащую тип ввода → file < - Я смог загрузить изображение без изменения его размера, после чего решил для изменения размера изображения, чтобы я установил библиотеку изображений вмешательства, используя:
composer require intervention/image
тогда я интегрировал библиотеку в свою структуру Laravel
Intervention\Image\ImageServiceProvider::class
'Image' => Intervention\Image\Facades\Image::class
и, наконец, я сконфигурировал его следующим образом
php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"
мой контроллер выглядит следующим образом
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use Image;
class ProjectController extends Controller{
public function project(Request $request){
$file = Input::file('file');
$fileName = time().'-'.$file->getClientOriginalName();
$file -> move('uploads', $fileName);
$img=Image::make('public/uploads/', $file->getRealPath())->resize(320, 240)->save('public/uploads/',$file->getClientOriginalName());
}
}
но вместо изменения размера pic вызывается следующее исключение
NotReadableException in AbstractDecoder.php line 302:
Image source not readable
Ответы
Ответ 1
Разве это не Image::make($file->getRealPath())
вместо Image::make('public/uploads/', $file->getRealPath())
?
Image::make()
, похоже, не принимает два аргумента, так что это может быть вашей проблемой.
Попробуйте следующее:
$file = Input::file('file');
$fileName = time() . '-' . $file->getClientOriginalName();
$file->move('uploads', $fileName);
$img = Image::make($file->getRealPath())
->resize(320, 240)
->save('public/uploads/', $file->getClientOriginalName());
Или, если вы хотите сделать это, не перемещая сначала файл, попробуйте следующее:
$file = Input::file('file');
$img = Image::make($file)
->resize(320, 240)
->save('public/uploads/', $file->getClientOriginalName());
Ответ 2
В L5.2
невозможно получить изображение с фасада Input
. Для этого нам нужно сначала сохранить изображение на сервере, а затем передать путь в фасад Image
для выполнения операций с изображением.
Код нравится:
if ($request->hasFile('picture') ) {
$destinationPath = public_path('uploads/user');
$photoname = date("YmdHis");
$file_extention = '.'.$request->file('picture')->getClientOriginalExtension();
$photo = $photoname.$file_extention;
$file_check = $request->file('picture')->move($destinationPath, $photo);
$thumb_path = $destinationPath.'/thumbnail/'.$photo;
$new_filePath = $destinationPath.'/'.$photo;
$assets_path = url('uploads/user/');
$img = Image::make($assets_path.'/'.$photo)->fit(100)->save($thumb_path,40);
$data['picture'] = $photo;
}
Я искал прямое решение, т.е. как можно было ранее снимать изображение непосредственно с фасада Input
. Если у кого-то из вас есть прямое решение, покажите свой код здесь, и я вознагражу вас за эту награду. Приветствия.
Ответ 3
Загрузка файла и изменение его размера до сохранения так же просто:
(Без проверки или проверки)
Вы можете напрямую передать экземпляр UploadedFile в InterventionImage:: make()
public function upload(Request $request)
{
$file = $request->file('file');
$filename = $file->getClientOriginalName();
$img = \Image::make($file);
$img->resize(320, 240)->save(public_path('uploads/'.$filename))
}
Если вы хотите сохранить исходный размер и изменить размер изображения:
$img->save(public_path('uploads/'.$filename))
->resize(320, 240)
->save(public_path('uploads/thumb_'.$filename));
Это было просто проверено на последней версии 5.2 с 5.2.45
[EDIT:]
Если вы вызываете
$file->move();
Не используйте
$file->getRealPath()
потому что это вернет false после вызова move()
$filename = $file->getClientOriginalName();
$file->move('uploads', $filename);
dd($file->getRealPath());
Ответ 4
Эта проблема возникла при изменении размера изображения после перемещения.
$file->move('uploads', $fileName);
$file->getRealPath()
вернет false
после перемещения изображения. Перед перемещением необходимо изменить размер изображения. Что это;)
$img=Image::make('public/uploads/', $file->getRealPath())->resize(320, 240)->save('public/uploads/',$file->getClientOriginalName());
$file->move('uploads', $fileName);