Yii - Upload de arquivos

Você pode implementar facilmente uma função de upload de arquivo com a ajuda de yii\web\UploadedFile, models e yii\widgets\ActiveForm.

Crie um diretório ‘uploads’na pasta raiz. Este diretório conterá todas as imagens carregadas. Para carregar um único arquivo, você precisa criar um modelo e um atributo do modelo para a instância do arquivo carregado. Você também deve validar o upload do arquivo.

Step 1 - Dentro do models pasta, crie um arquivo chamado UploadImageForm.php com o seguinte conteúdo.

<?php
   namespace app\models;
   use yii\base\Model;
   class UploadImageForm extends Model {
      public $image; public function rules() { return [ [['image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, png'], ]; } public function upload() { if ($this->validate()) {
            $this->image->saveAs('../uploads/' . $this->image->baseName . '.' .
               $this->image->extension);
            return true;
         } else {
            return false;
         }
      }
   }
?>

o imageatributo é usado para manter a instância do arquivo. ofile regra de validação garante que um arquivo tenha um png ou um jpgextensão. A função de upload valida o arquivo e o salva no servidor.

Step 2 - Agora, adicione o actionUploadImage função para o SiteController.

public function actionUploadImage() {
   $model = new UploadImageForm();
   if (Yii::$app->request->isPost) { $model->image = UploadedFile::getInstance($model, 'image'); if ($model->upload()) {
         // file is uploaded successfully
         echo "File successfully uploaded";
         return;
      }
   }
   return $this->render('upload', ['model' => $model]);
}

Step 3 - Quando o formulário é enviado, ligamos para o yii\web\UploadedFile::getInstance() função para representar o arquivo carregado como um UploadedFileinstância. Em seguida, validamos o arquivo e o salvamos no servidor.

Step 4 - Em seguida, crie um upload.php ver o arquivo dentro do views/site diretório.

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

Lembre-se de adicionar o enctype opção quando você carrega um arquivo. The fileInput() método renderiza o seguinte código html -

<input type = "file">

O código html acima permite que os usuários selecionem e carreguem arquivos.

Step 5 - Agora, se você for para http://localhost:8080/index.php?r=site/upload-image, você verá o seguinte.

Step 6- Selecione uma imagem para carregar e clique no botão “enviar”. O arquivo será salvo no servidor dentro do‘uploads’ pasta.