Как загрузить файл в каталог в yii2?

У меня есть ActiveForm, и я хочу добавить поле, где пользователь может загружать свои фотографии. проблема в том, что у меня нет атрибута для изображения в таблице users, и каждое поле ввода в 'yii' ожидает модель и атрибут следующим образом.

<?= $form->field($model, 'attribute')->input($platforms) ?> 

я не хочу назначать изображение любой записи, и я не хочу вставлять ее в базу данных, я хочу, чтобы она была загружена в определенную папку.

Я также проверил библиотеку kartik, но также требует поля атрибута.

Следуйте официальной документации

https://github.com/yiisoft/yii2/blob/master/docs/guide/input-file-upload.md

Модель формы

 namespace app\models; use yii\base\Model; use yii\web\UploadedFile; /** * UploadForm is the model behind the upload form. */ class UploadForm extends Model { /** * @var UploadedFile|Null file attribute */ public $file; /** * @return array the validation rules. */ public function rules() { return [ [['file'], 'file'], ]; } } ?> 

Просмотр формы

 <?php use yii\widgets\ActiveForm; $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?> <?= $form->field($model, 'file')->fileInput() ?> <button>Submit</button> <?php ActiveForm::end(); ?> 

контроллер

Теперь создайте контроллер, который соединяет форму и модель вместе:

 <?php namespace app\controllers; use Yii; use yii\web\Controller; use app\models\UploadForm; use yii\web\UploadedFile; class SiteController extends Controller { public function actionUpload() { $model = new UploadForm(); if (Yii::$app->request->isPost) { $model->file = UploadedFile::getInstance($model, 'file'); if ($model->validate()) { $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); } } return $this->render('upload', ['model' => $model]); } } ?> 

Вместо model->load(...) мы используем UploadedFile::getInstance(...) . [[\yii\web\UploadedFile|UploadedFile]] не запускает проверку модели. Он содержит только информацию о загруженном файле. Поэтому вам нужно выполнить проверку вручную с помощью $model->validate() . Это запускает [[yii\validators\FileValidator|FileValidator]] который ожидает файл:

  $file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE //in code framework 

Если проверка прошла успешно, мы сохраняем файл:

  $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); 

Если вы используете «основной» шаблон приложения, то папки в папке должны быть созданы в Интернете.

Вот и все. Загрузите страницу и попробуйте загрузить. Уалаоды должны заканчиваться базовыми / веб-/ загружаемыми.

на ваш взгляд

 use kartik\widgets\ActiveForm; use kartik\widgets\FileInput; $form = ActiveForm::begin(['options' => ['enctype'=>'multipart/form-data']]); //important echo FileInput::widget([ 'name' => 'filename', 'showUpload' => false, 'buttonOptions' => ['label' => false], 'removeOptions' => ['label' => false], 'groupOptions' => ['class' => 'input-group-lg'] ]); echo Html::submitButton('Submit', ['class'=>'btn btn-primary']); ActiveForm::end(); 

в вашем контроллере

 $file = \yii\web\UploadedFile::getInstanceByName('filename'); $file->saveAs('/your/directory/'.$file->name); 

Создайте атрибут только для чтения для вашей модели, например public $image и продолжайте

  <?= $form->field($model, 'image')->fileInput() ?> 

Мне очень нравится Yii2 Dropzone .

Монтаж:

 composer require --prefer-dist perminder-klair/yii2-dropzone "dev-master" 

Применение:

 <?php echo \kato\DropZone::widget([ 'options' => [ 'url'=> Url::to(['resource-manager/upload']), 'paramName'=>'image', 'maxFilesize' => '10', ], 'clientEvents' => [ 'complete' => "function(file){console.log(file)}", 'removedfile' => "function(file){alert(file.name + ' is removed')}" ], ]); ?> 

контроллер:

 public function actionUpload(){ $model = new ResourceManager(); $uploadPath = Yii::getAlias('@root') .'/uploads/'; if (isset($_FILES['image'])) { $file = \yii\web\UploadedFile::getInstanceByName('image'); $original_name = $file->baseName; $newFileName = \Yii::$app->security ->generateRandomString().'.'.$file->extension; // you can write save code here before uploading. if ($file->saveAs($uploadPath . '/' . $newFileName)) { $model->image = $newFileName; $model->original_name = $original_name; if($model->save(false)){ echo \yii\helpers\Json::encode($file); } else{ echo \yii\helpers\Json::encode($model->getErrors()); } } } else { return $this->render('upload', [ 'model' => $model, ]); } return false; } 

введите этот код после вашего загруженного кода

  //save the path in DB.. $model->file = 'uploads/'.$imageName.'.'.$model->file->extension; $model->save(); 

Если у вас есть несколько файлов при загрузке, вы должны использовать foreach для этого. И вы должны указать фактическое имя файла в столбце таблицы, и зашифрованное значение этого имени необходимо сохранить, чтобы избежать дублирования в каталоге. Что-то вроде этого ..

 $userdocs->document_name = UploadedFile::getInstances($userdocs, 'document_name'); foreach ($userdocs->document_name as $key => $file) { $img_name = Yii::$app->security->generateRandomString(); $file->saveAs('user/business_files/' . $img_name . '.' . $file->extension); $images = $img_name . '.' . $file->extension; $userdocs->actual_name = $file->name; $userdocs->user_id = $user->id; $userdocs->document_name = $images; $userdocs->save(false); $userdocs = new UserDocs(); } 

Здесь генерируется случайная строка, и она будет назначаться с именем документа, и она будет сохранена в таблице. UserDocs – это имя модели.