June 16, 2011
by Sabit Huraira
Sebelum kita bahas cara membuat fungsi upload file ke server, saya akan jelaskan bahwa bagaimana alur file yang kita upload akan disimpan di dalam database. Okeh, pada postingan ini, file yang kita upload ke server tidaklah masuk ke dalam database, yang kita masukkan di dalam databse adalah PATH dari file tersebut. Ada cara dimana kita bisa menyimpan suatu file ke dalam database kita yaitu dengan menggunakan type BLOB(Binary Large Object). Dimana file yang akan disimpan ke dalam database akan di konversi terlebih dahulu ke dalam Binary file dan disimpan ke dalam database kita. Memang lebih simpel, tapi menyimpan nya langsung ke dalam database tidaklah baik. Karena menurut pengalaman saya, saat file nya ditampilkan file ny berubah :D. Contoh, saya pernah upload gambar, dan ketika gambar ny mau saya tampilin gambar ny berubah :D.
Okeh, udah panjang lebar kita bahas. Mari kita bahas cara coding ny di yii…
Pada models tempat penyimpanan path nya, beri batasan pada rules nya agar hanya data-data bertipe tertentu yang bisa di upload. Berikut cara membuat rules nya:
public function rules()
{
return array(
array('namaAttributFile', 'file', 'types'=>'jpg, gif, png, pdf'),
);
}
tinggal anda masukkan saja tipe file apa saja yang mau anda support untuk upload file nya..
nah, setelah itu kita buat di controller ny perintah untuk melakukan upload file nya. Pada contoh kali ini, saya melakukan upload file pada action “create”, begini contoh code nya:
public function actionCreate()
{
$model=new NamaModel;
if(isset($_POST['NamaModel']))
{
$model->attributes=$_POST['NamaModel'];
$model->namaAttribute=CUploadedFile::getInstance($model,'namaAttribute');
if($model->save())
{
$model->namaAttribute->saveAs('path/to/localFile');
$this->redirect(array('view','id'=>$model->id));
}
}
$this->render('create', array('model'=>$model));
}
Nah, anda tinggal lakukan setting path posisi tempat anda ingin menyimpan file yang anda upload dan contoh di atas sudah bisa menjalankan perintah upload file nya…
Beberapa permasalahan klasik pada upload file adalah dimana kadang kita ingin mengubah nama file yang kita upload sesuai dengan kemauan kita. Dan biasa ny kita juga ingin path dari file yang kita simpan otomatis akan langsung mengarah ke path project kita.. Okeh untuk permasalahan seperti itu, silahkan anda rubah code pada action “create” nya menjadi seperti berikut:
public function actionCreate()
{
$model=new NamaModel;
if(isset($_POST['NamaModel']))
{
$model->attributes=$_POST['NamaModel'];
$simpanSementara=CUploadedFile::getInstance($model,'namaAttribut');
if($model->save())
{
$simpanSementara->saveAs(Yii::app()->basePath .
'/../namaFolder/' . $model->id.'.pdf');
$this->redirect(array('view','id'=>$model->id));
}
}
$this->render('create',array(
'model'=>$model,
));
}
Penjelasan:
Pada contoh diatas, saya menyimpan file yang di upload ke dalam foleder : Project/namaFolder. Kunci nya ada pada kode ini:
$simpanSementara->saveAs(Yii::app()->basePath . '/../namaFolder/' . $model->id.'.pdf');
Pada code tsb, terlihat bahwa kita melakukan penyimpanan file di dalam Project kita, dan di dalam folder “namaFolder”. Selain itu juga kita mengubah nama file yang kita upload sesuai dengan nama attribut “id” nya, dan kita simpan nama nya bertipe “.pdf”. Silahkan anda konfigurasi sendiri sesuai dg kemauan anda yak 😀
Eits.. belum selesai proses ny… kita masih harus edit tampilannya dulu gan 😀 …
Sekarang silahkan buka view nya, dan buka file “form.php”. Di bagian atas form tersebut, ubah code ny menjadi seperti berikut:
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'laporan-form',
'enableAjaxValidation'=>false,
'htmlOptions'=>array('enctype'=>'multipart/form-data'),
)); ?>
Dan untuk merubah control “namaAttribut” agar nanti tampilannya kita tinggal klik dan langsung terbuka form yang menyuruh kita memilih folder, maka rubah code nya dari seperti ini:
<?php echo $form->textField($model,'namaAttribute',array('size'=>50,'maxlength'=>50)); ?>
Menjadi seperti ini:
<?php echo $form->fileField($model,'namaAttribute',array('size'=>50,'maxlength'=>50)); ?>
Selesai…
Silahkan anda coba langsung…
Semoga membantu 😀
Komentar