@MaikMain
Начинающий backend - developer

Как загрузить файл на сервер. Yii2?

Добрый день
У меня такая проблема, мне нужно сделать загрузку текстового файла на сервер и название файла с расширением записать в БД. Перепробовал кучу методов описанных в интернете ничего не помогло.
Потом пробовал сделать вот так, как показывал в своих видео Максим Тимофеев , но тоже не помогло.
Я добавил такой алиас:
Yii::setAlias('@books', dirname(dirname(dirname(__DIR__))) . '/public_html/uploads/books/');

Вся модель Book:
Вся модель Book
<?php

namespace common\models;

use Yii;
use yii\helpers\Url;
use yii\web\UploadedFile;

class Book extends \yii\db\ActiveRecord
{

    const IMAGES_SIZE = [
        ['50', '50'],
    ];
    public $file;
    public $bookfile;

    public static function tableName()
    {
        return 'book';
    }

    public function rules()
    {
        return [
            [['category_id', 'author_id', 'name', 'language', 'year', 'status'], 'required'],
            [['category_id', 'year', 'status'], 'integer'],
            [['content'], 'string'],
            [['name', 'language', 'keywords', 'description', 'bookfile'], 'string', 'max' => 255],
            [['author_id'], 'string', 'max' => 50],
            [['image'], 'string', 'max' => 100],
            [['file'], 'image'],
            [['bookfile'], 'file', 'extensions' => 'txt,docx,pdf,fb2'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => '№',
            'category_id' => 'Категория',
            'author_id' => 'Автор',
            'name' => 'Название',
            'content' => 'Текс',
            'language' => 'Язык',
            'year' => 'Год',
            'keywords' => 'Ключевые слова',
            'description' => 'Описание',
            'bookfile' => 'Книга',
            'smallImage' => 'Картинка',
            'image' => 'Картинка',
            'file' => 'Картинка',
            'statusName' => 'Статус',
            'status' => 'Статус',
        ];
    }

    public function getAuthor()
    {
        return $this->hasOne(Author::className(), ['id' => 'author_id']);
    }

    public function getCategory() {
        return $this->hasOne(Category::className(), ['id' => 'category_id']);
    }

    public function getFirstLetter() {
        return mb_substr($this->name, 0, 1, 'utf-8');
    }

    public static function getStatusList()
    {
        return ['Выкл', 'Вкл'];
    }

    public function getStatusName()
    {
        $list = self::getStatusList();
        return $list[$this->status];
    }

    public function getSmallImage() {
        if($this->image) {
            $path = str_replace('admin/', '', Url::home(true)).'uploads/image/book/50x50/'.$this->image;
        }
        else {
            $path = str_replace('admin/', '', Url::home(true)).'uploads/image/no-image.svg';
        }
        return $path;
    }

    public function beforeSave($insert)
    {
        if($file = UploadedFile::getInstance($this, 'file')){
            $dir = Yii::getAlias('@images').'/book/';
            if(file_exists($dir.$this->image)){
                @unlink($dir.$this->image);
            }
            if(file_exists($dir.'50x50/'.$this->image)){
                @unlink($dir.'50x50/'.$this->image);
            }
            $this->image = strtotime('now').'_'.Yii::$app->getSecurity()->generateRandomString(6)  . '.' . $file->extension;
            $file->saveAs($dir.$this->image);
            $imag = Yii::$app->image->load($dir.$this->image);
            $imag->background('#fff',0);
            $imag->resize('50','50', Yii\image\drivers\Image::INVERSE);
            $imag->crop('50','50');
            $imag->save($dir.'50x50/'.$this->image, 90);
        }
        if($file = UploadedFile::getInstance($this, 'bookfile')){
            $dir = Yii::getAlias('@books');
            if(file_exists($dir.$this->bookfile)){
                @unlink($dir.$this->bookfile);
            }
            $this->bookfile = strtotime('now').'_'.Yii::$app->getSecurity()->generateRandomString(6)  . '.' . $file->extension;
            $file->saveAs($dir.$this->bookfile);
        }
        return parent::beforeSave($insert);
    }

    public function beforeDelete()
    {
        if (parent::beforeDelete()) {
            $dir = Yii::getAlias('@images').'/book/';
            if(file_exists($dir.$this->image)){
                @unlink($dir.$this->image);
            }
            foreach (self::IMAGES_SIZE as $size){
                $size_dir = $size[0].'x';
                if($size[1] !== null)
                    $size_dir .= $size[1];
                if(file_exists($dir.$this->image)){
                    @unlink($dir.$size_dir.'/'.$this->image);
                }
            }
            return true;
        } else {
            return false;
        }
    }
}

Здесь много лишнего, но может быть что-то с чем-то как-то конфликтует.
А это форма:
<?php $form = ActiveForm::begin([
            'options' => ['enctype' => 'multipart/form-data'],
        ]); ?>
<?= $form->field($model, 'bookfile',['options' => ['class' => 'col-xs-12']])->fileInput() ?>
<?= $form->field($model, 'file',['options' => ['class' => 'col-xs-4']])->widget(FileInput::classname(), [
                            'options' => ['accept' => 'image/*'],
                            'pluginOptions' => [
                                'showCaption' => false,
                                'showRemove' => false,
                                'showUpload' => false,
                                'browseClass' => 'btn btn-primary btn-block',
                                'browseIcon' => '<i class="glyphicon glyphicon-camera"></i> ',
                                'browseLabel' =>  'Выбрать фото'
                            ],
                        ]);?>
<div class="form-group">
            <?= Html::submitButton($model->isNewRecord ? 'Добавить' : 'Редактировать', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
        </div>
        <?php ActiveForm::end(); ?>
  • Вопрос задан
  • 973 просмотра
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
У Вас в модели Book всё свалено в кучу. И данные автора и данные об изображении.
Не надо ничего выдумывать. Возьмите статью из документации и сделайте отдельную модель для загрузки файла.
И когда она у Вас заработает, то тогда будет думать, как совмещать её с другими моделями.
Это во-первых.
Во-вторых, что именно у Вас не получается? Какие ошибки, предупреждения в debug панели и консоли браузера?
Вы уверены, что путь
dirname(dirname(dirname(__DIR__))) . '/public_html/uploads/books/'
верен?
Проверьте, что покажет Вам
echo dirname(dirname(dirname(__DIR__))) . '/public_html/uploads/books/'
, куда он Вас ведёт?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MaikMain Автор вопроса
Начинающий backend - developer
Проблема решена, лично мне помог вот этот урок: https://www.youtube.com/watch?v=2NOHrukCHBU
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы