Загрузка файлов (изображений) на сервер в Yii2

Простая загрузка файла

Загрузка одного файла

Класс UploadFileForm

class UploadFileForm extends Model
{
/**
* @var UploadedFile
*/
public $file;
public function rules()
{
return [
['file', 'image',
'extensions' => ['jpg', 'jpeg', 'png', 'gif'],
'checkExtensionByMimeType' => true,
'maxSize' => 512000, // 500 килобайт = 500 * 1024 байта = 512 000 байт
'tooBig' => 'Limit is 500KB'
],
];
}
public function upload()
{
if ($this->validate()) {
$dir = 'uploads/'; // Директория - должна быть создана
$name = $this->randomFileName($this->file->extension);
$file = $dir . $name;
$this->file->saveAs($file); // Сохраняем файл
return true;
} else {
return false;
}
}
private function randomFileName($extension = false)
{
$extension = $extension ? '.' . $extension : '';
do {
$name = md5(microtime() . rand(0, 1000));
$file = $name . $extension;
} while (file_exists($file));
return $file;
}
}

Представление:

<?php
/* @var $this yii\web\View */
/* @var $model \frontend\forms\UploadFileForm */
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(['options' => []]) ?>
<?= $form->field($model, 'file')->fileInput() ?>
<button>Submit</button>
<?php ActiveForm::end() ?>

Контроллер:

public function actionOneFile()
{
$model = new UploadFileForm();
if (Yii::$app->request->isPost) {
$model->file = UploadedFile::getInstance($model, 'file');
if ($model->upload()) {
Yii::$app->session->setFlash('success', 'Изображение загружено');
return $this->refresh();
}
}
return $this->render('index', ['model' => $model]);
}

Можно получить файл не из модели. Например, получить файл при отправке запроса по API:

$file = UploadedFile::getInstanceByName('file');

Загрузка нескольких файлов

Класс UploadFilesForm

class UploadFilesForm extends Model
{
/**
* @var UploadedFile[]
*/
public $files;
public function rules()
{
return [
['files', 'image',
'extensions' => ['jpg', 'jpeg', 'png', 'gif'],
'checkExtensionByMimeType' => true,
'maxSize' => 512000, // 500 килобайт = 500 * 1024 байта = 512 000 байт
'tooBig' => 'Limit is 500KB',
'maxFiles' => 5
]
];
}
public function upload()
{
if ($this->validate()) {
foreach ($this->files as $file) {
$file->saveAs('uploads/' . $this->randomFileName($file->extension));
}
return true;
} else {
return false;
}
}
private function randomFileName($extension = false)
{
$extension = $extension ? '.' . $extension : '';
do {
$name = md5(microtime() . rand(0, 1000));
$file = $name . $extension;
} while (file_exists($file));
return $file;
}
}

Представление:

<?php
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model \frontend\forms\UploadFileForm */
?>
<?php $form = ActiveForm::begin(['options' => []]) ?>
<?= $form->field($model, 'files[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?>
<button>Submit</button>
<?php ActiveForm::end() ?>

Контроллер:

public function actionMultiFile()
{
$model = new UploadFilesForm();
if (
Источник: Перейти
Комментарии (0):
Чтобы оставить свой комментарий, необходимо пройти аутентификацию