Upload file và xử lý dữ liệu nâng cao

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 21 tháng 5, 2025

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áo enctype.

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.

Website Logo

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.

Bình luận

Website Logo

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

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ