Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 22.06.2016 22:01:36

Прошу поправить мой код с отправкой файла на сервер

Есть сайт новостной, уже сделал на сайте функции "Добавить новость", "Редактировать новость", "Удалить новость".

Моя форма добавления новости на сайт

<form action="{{ route('news.store') }}" method="POST" enctype="multipart/form-data">
    <div class="auth-control">
        <label class="auth-control_label" for="title">Заголовок</label>
        <input class="auth-control_input" placeholder="Введите заголовок" type="text" name="title" required autofocus>
    </div>
    <div class="auth-control">
        <label class="auth-control_label" for="image">Картинка</label>
        <input class="auth-control_input" type="file" name="image" id="image">
    </div>
    <div class="auth-control">
        <label class="auth-control_label" for="description">Описание</label>
        <input class="auth-control_input" placeholder="Введите описание" type="text" name="description" required autofocus>
    </div>
    <div class="auth-control">
        <label class="auth-control_label" for="full_description">Полное описание</label>
        <textarea class="auth-control_textarea" name="full_description" id="full_description" cols="30" row="10" required></textarea>
    </div>
    <div class="auth-control">
        <label class="auth-control_label" for="author">Автор</label>
        <input class="auth-control_input" placeholder="Введите автора" type="text" name="author" required autofocus>
    </div>
    <div class="auth-control button-control">
        <button class="auth-control_button" type="submit">Добавить</button>
    </div>

    <input type="hidden" name="_token" value="{{ csrf_token() }}">

</form>

Как вы видите при добавлении новой новости на сайт есть поля такие как:
"Заголовок", "Описание", "Полное описание", "Автор". Это все правильно работает.
Но есть проблема, а проблема с изображением. Надо чтобы ты мог заполнять все поля, и выбирать одну нужную картинку для новости, и чтобы она проходила через валидацию и меняла формат изображения а так же размер картинки.

Вот сам метод store моего контроллера NewsController:

public function store(PublishNewsRequest $requestData)
    {
        $news = new News;
        $news->title = $requestData['title'];
        $news->description = $requestData['description'];
        $news->full_description = $requestData['full_description'];
        $news->author = $requestData['author'];
        $news->destination_path = $requestData['destination_path'];

        if($requestData->hasFile('image'))
        {
            $file = $requestData->input('image');
            $timestamp = str_replace([' ', ':'], '-', Carbon::now()->toDateTimeString());
            $name = $timestamp . '-' . $file->getClientOriginalName();
            $news->filePath = $name;
            $file->move(public_path() . '/images/', $name);
        }

        $news->save();

        return redirect()->route('news.index');
    }

Моя миграция:

public function up()
    {
        Schema::create('news', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('description');
            $table->text('full_description');
            $table->string('author');
            $table->string('file_path');
            $table->timestamps();
        });
    }

Моя модель:

class News extends Model
{
    protected $table = 'news';
    protected $fillable = [
        'title',
        'description',
        'full_description',
        'author',
        'file_path',

    ];
}

Мои роуты относящийся к моему контроллеру NewsController:

Route::get('/', ['as' => 'news.index', 'uses' => 'NewsController@index']);
Route::post('news', ['as' => 'news.store', 'uses' => 'NewsController@store']);
Route::get('news/create', ['as' => 'news.create', 'uses' => 'NewsController@create' ]);
Route::patch('news/{news}', ['as' => 'news.update', 'uses' => 'NewsController@update']);
Route::get('news/{news}', ['as' => 'news.show', 'uses' => 'NewsController@show']);
Route::put('news/{news}', ['as' => 'news.update', 'uses' => 'NewsController@update']);
Route::get('news/{news}/edit', ['as' => 'news.edit', 'uses' => 'NewsController@edit']);
Route::delete('news/{news}', ['as' => 'news.destroy', 'uses' => 'NewsController@destroy']);
Route::post('upload', ['as' => 'upload.image', 'uses' => 'NewsController@uploadImage']);

Прошу опытных разработчиков на laravel подправить мой код. В данный момент ругается на ошибку $name = $timestamp . '-' . $file->getClientOriginalName();
Выдает такую ошибку Call to a member function getClientOriginalName() on null.

PS Сразу говорю, загрузку файлов на сервер никогда на php не делал, возможно много ошибок в коде у меня, так как я полностью алгоритм загрузки файла на сервер не знаю. Прошу знающим людям помочь мне.

Не в сети

#2 22.06.2016 23:41:28

Re: Прошу поправить мой код с отправкой файла на сервер

В контроллере поменяй вот это

$file = $requestData->input('image');

на вот это

$file = $requestData->file('image');

Не в сети

#3 23.06.2016 00:33:58

Re: Прошу поправить мой код с отправкой файла на сервер

Stokke пишет:

В контроллере поменяй вот это

$file = $requestData->input('image');

на вот это

$file = $requestData->file('image');

Спасибо вам за помощь, все получилось. Теперь возник вопрос, а как же обновлять мою картинку? Допустим загрузил не ту картинку по случайности, и хочу её редактировать.

Пробовал так, но картинка не меняется и не добавляется в корневую папку на сервер.

public function update($id, PublishNewsRequest $requestData)
    {
        $news = News::find($id);

        $news->title = $requestData['title'];
        $news->description = $requestData['description'];
        $news->full_description = $requestData['full_description'];
        $news->author = $requestData['author'];

        if($requestData->hasFile('image'))
        {
            $file = $requestData->file('image');
            $timestamp = str_replace([' ', ':'], '-', Carbon::now()->toDateTimeString());
            $name = $timestamp . '-' . $file->getClientOriginalName();
            $news->file_path = $name;
            $file->move(public_path() . '/images/', $name);
        }

        $news->save();

        return redirect()->route('news.index');
    }

Не в сети

#4 23.06.2016 14:53:14

Re: Прошу поправить мой код с отправкой файла на сервер

Ну, по идее должно работать big_smile во всяком случае у меня в подобном коде все нормально. Правда я пользуюсь Intervention Image пакетом, хз.
Сделай dd($news) и посмотри чего там вообще происходит

Не в сети

#5 23.06.2016 20:38:44

Re: Прошу поправить мой код с отправкой файла на сервер

Stokke пишет:

Ну, по идее должно работать big_smile во всяком случае у меня в подобном коде все нормально. Правда я пользуюсь Intervention Image пакетом, хз.
Сделай dd($news) и посмотри чего там вообще происходит

Получил следующее http://s017.radikal.ru/i431/1606/79/ea5ae9e7ff3f.png

Не в сети

Подвал раздела