آپلود فایل با استفاده از CUploadedFile در Yii

 

آموزش بعدی ای که در خدمت شما هستیم نحوه ی  آپلود فایل می باشد.

فایل آپلودی شما میتونه تصویر , صوت یا فیلم باشه .

فریم ورک یی کلاسی با نام CUploadedFile داره که امکان آپلود فایل را برای ما فراهم میکنه .

برای اینکار   ابتدا ستونی به جدول user  اضافه میکنم با نام path :


CREATE TABLE yiiteach.user (
id int(11) NOT NULL AUTO_INCREMENT,
email varchar(250) DEFAULT NULL,
password varchar(250) DEFAULT NULL,
first_name varchar(250) DEFAULT NULL,
last_name varchar(250) DEFAULT NULL,
status int(11) DEFAULT 1,
path varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
INDEX id (id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
AVG_ROW_LENGTH = 5461
CHARACTER SET utf8
COLLATE utf8_general_ci;

خوب حالا وقتشه که به مدلمون path رو اضافه کنیم:

class User extends CActiveRecord {
public function tableName() {
return 'user';
}
public function rules() {
return array(
array('status', 'numerical', 'integerOnly' => true),
array('email, password, first_name, last_name', 'length', 'max' => 250),
array('id,path email, password, first_name, last_name, status', 'safe', 'on' => 'search'),
);
}
public function relations() {
return array(
);
}
public function attributeLabels() {
return array(
'id' => 'شناسه کاربری',
'email' => 'آدرس ایمیل',
'password' => 'رمزعبور',
'first_name' => 'نام',
'last_name' => 'نام خانوادگی',
'status' => 'وضعیت',
'path' => 'تصویر',
);
}
public function search() {
$criteria = new CDbCriteria;
$criteria->compare('id', $this->id);
$criteria->compare('email', $this->email, true);
$criteria->compare('password', $this->password, true);
$criteria->compare('first_name', $this->first_name, true);
$criteria->compare('last_name', $this->last_name, true);
$criteria->compare('status', $this->status);
$criteria->compare('path', $this->path, true);
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
public static function model($className = __CLASS__) {
return parent::model($className);
}
}

مرحله ی بعدی تنظیمات فورممونه
۲ تاکار باید انجام بدیم:
اول اینکه امکان ارسال فایلو به فورممون اضافه کنیم :

enctype="multipart/form-data"

دوم امکان انتخاب فایل را به کاربر بدهیم

"input type="file" name="path

برای انجام این قسمت ها ابتدا به فورممون واقع در فولدر views سپس فولدر user و فایل _form.php میریم و در شروع ویجت فورمون تغییرات زیر را اعمال میکنیم

$form = $this->beginWidget('CActiveForm', array(
'id' => 'user-form',
'enableAjaxValidation' => false,
'htmlOptions' => array(
'enctype' => 'multipart/form-data',
)

));

مرحله ی بعدی قرار دادن امکان انتخاب فایل هست

$form->labelEx($model, 'path');
CHtml::activeFileField($model, 'path', array());
$form->error($model, 'path');

با استفاده از CHtml::activeFileField تگ input با type = file ایجاد میشه واستون .
حالا باید توی کنترلر فایل ارسالی را دریافت کنیم و در جایی ذخیره کنیم.
خوب ابتدا با استفاده از کد زیر مقدار ارسالی توسط فایل آپلود را میگیریم :

$uploadedFile = CUploadedFile::getInstance($model, 'path');

فایل ارسال شده دریافت شد
مرحله ی بدی اینهکه ببینیم ایا فایلی ارسال شده یا نه :

if (!is_null($uploadedFile)) {

اگر خالی نبود
میایم پسوند فایلی که ارسال شدرو دریافت میکنیم.
با استفاده از این کد :

pathinfo($uploadedFile, PATHINFO_EXTENSION)

مثلا ما تصویری با فرمت jpg ارسال کردیم با استفاده از این کد مقدار برگشتیه ما میشه jpg
خوب از اونجایی که ممکنه تصویری که میفرستیم در نام شبیه تصاویر دیگه باشه , پس ما یه نام رندوم انتخاب میکنیم
برای این کار یه نام رندوم به پسوند فایل دریافتی اضافه میکنیم به این شکل:

$fileName = "{$time}." . pathinfo($uploadedFile, PATHINFO_EXTENSION);

که $time از کد زیر استخراج شده :
$time=time();
خوب حالا مقدار به دست آمدرو در دیتا بیس ذخیره میکنیم
$model->path = $fileName;

قسمت بعدی و آخر اینه که فایل گرفته شدرو در جایی ذخیره کنیم که بعد ها بتونیم اونو نمایش بدیم .
برای این کار من از فولدر images که به صورت پیش فرض در روت سایت قرار داره استفاده میکنم

$dir = dirname(Yii::app()->basePath) . '/images/' . $fileName;

عکس در مسیر /images/ قرار میگیره
و در نهایت
آپلود تصویر
با استفاده از کد زیر:

$uploadedFile->saveAs($fileName);

من یه اطلاعات جدید همراه با تصویر با استفاده از فورمم ایجاد میکنم نتیجه ای که در دیتابیس ذخیره شده به این شکل هست

 آموزش فریمورک یی, آموزش فریم ورک یی, فریمورک یی, فریم ورک یی, فریمورکyii, فریم ورک yii, yiiframework, yii framework,
در نتیجه actionCreate ما به این صورت میشه

public function actionCreate() {
$model = new User;

// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);

if (isset($_POST['User'])) {
$time = time();
$model->attributes = $_POST['User'];
$uploadedFile = CUploadedFile::getInstance($model, 'path');

if (!is_null($uploadedFile)) {
$fileName = "{$time}." . pathinfo($uploadedFile, PATHINFO_EXTENSION);
$model->path = $fileName;
$dir = dirname(Yii::app()->basePath) . '/images/' . $fileName;
}
$password = $_POST['User']['password'];
$salt = $_POST['User']['email'];
$crypt = crypt($password, $salt);
$model->password = $crypt;
if ($model->save()) {
if (isset($dir)) {
$uploadedFile->saveAs($dir);
}

$this->redirect(array('view', 'id' => $model->id));
}
} else {
$this->render('create', array(
'model' => $model,
));
}
}

برای نمایش تصویر هم اگر به ویو برین و کد زیر را وارد کنید میتونین تصویر را ببینید :
فولدر views سپس فولدر user و در آخر view.php

img src=" '/images/'. $model->path; " width="200" height="200"

 آموزش فریمورک یی, آموزش فریم ورک یی, فریمورک یی, فریم ورک یی, فریمورکyii, فریم ورک yii, yiiframework, yii framework,

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *