Upload file và xử lý dữ liệu nâng cao
Chức năng upload file là một tính năng phổ biến trong các ứng dụng web – dùng để người dùng tải ảnh đại diện, tài liệu, hay tập tin đính kèm. Yii hỗ trợ xử lý upload thông qua lớp yii\web\UploadedFile
. Trong bài học này, học viên sẽ được hướng dẫn cách xử lý file upload, giới hạn loại file, kích thước và đảm bảo an toàn khi lưu file vào hệ thống.

1. Tạo form model để xử lý file upload
Tạo một model chỉ dùng cho form upload:
// models/UploadForm.php
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
class UploadForm extends Model
{
/**
* @var UploadedFile
*/
public $file;
public function rules()
{
return [
[['file'], 'file',
'skipOnEmpty' => false,
'extensions' => 'png, jpg, jpeg, pdf',
'maxSize' => 1024 * 1024, // 1MB
'checkExtensionByMimeType' => true,
],
];
}
}
Rule
'file'
hỗ trợ các tùy chọn nhưextensions
,maxSize
, vàcheckExtensionByMimeType
để kiểm soát loại file và dung lượng.
2. Controller xử lý upload
// controllers/SiteController.php
use app\models\UploadForm;
use yii\web\UploadedFile;
public function actionUpload()
{
$model = new UploadForm();
if (Yii::$app->request->isPost) {
$model->file = UploadedFile::getInstance($model, 'file');
if ($model->validate()) {
$path = 'uploads/' . $model->file->baseName . '.' . $model->file->extension;
$model->file->saveAs($path);
Yii::$app->session->setFlash('success', 'Tải file thành công.');
}
}
return $this->render('upload', ['model' => $model]);
}
File được lưu vào thư mục
uploads/
trong thư mục gốc của ứng dụng. Thư mục này cần được cấp quyền ghi.
3. Tạo view upload
File views/site/upload.php
:
use yii\widgets\ActiveForm;
use yii\helpers\Html;
$this->title = 'Upload file';
?>
<h1><?= Html::encode($this->title) ?></h1>
<?php if (Yii::$app->session->hasFlash('success')): ?>
<div class="alert alert-success">Tập tin đã được tải lên thành công.</div>
<?php endif; ?>
<?php $form = ActiveForm::begin([
'options' => ['enctype' => 'multipart/form-data']
]); ?>
<?= $form->field($model, 'file')->fileInput() ?>
<div class="form-group">
<?= Html::submitButton('Tải lên', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
4. Các tùy chọn xác thực nâng cao
Bạn có thể kiểm soát:
-
Kích thước tối đa:
'maxSize' => 2 * 1024 * 1024 // 2MB
-
Định dạng file:
'extensions' => ['jpg', 'png', 'docx', 'pdf']
-
Chặn mã độc bằng cách giới hạn mime type và extension phù hợp, không cho upload PHP, EXE.
Ví dụ cụ thể
Giả sử bạn muốn cho phép người dùng tải ảnh đại diện định dạng jpg
, png
và không quá 1MB:
- Tạo model
UploadForm
như trên. - Controller xử lý với
UploadedFile::getInstance
. - View chứa form với
fileInput()
và khai báoenctype
.
Khi người dùng upload file vi phạm định dạng hoặc kích thước, hệ thống sẽ hiển thị lỗi phù hợp.
Kết luận
Upload file là tính năng quan trọng và cần được xử lý cẩn thận để đảm bảo an toàn. Yii hỗ trợ tốt việc xử lý file với UploadedFile
, cho phép lập trình viên kiểm soát định dạng, kích thước, và các ràng buộc cần thiết. Việc kết hợp với validation rules giúp đảm bảo dữ liệu đầu vào luôn hợp lệ và an toàn cho hệ thống.

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.
Xem thêm

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.
Liên hệ công việc qua email dưới đây.
lhvuctu@gmail.com