Источник изображения, недоступный для чтения в 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);