我會逐一說明 (以M->V->C的順序).
本次實作的目標:
將照片上傳至指定資料夾, 並將照片的檔名存到資料庫, 以便之後取用.
Model
在你的models裡的rules()新增以下code:
array('dbFieldsOfTheImage', 'file', 'types'=>'jpg, gif, png'),
1. 請將這邊的dbFieldsOfTheImage改為你照片上傳的資料表欄位名稱
2. types指的是, 指定的上傳檔案類型 (如果你要讓人上傳的是excel, 那就打上xls, xlsx...etc)
PS:還有許多參數可做設定, 例如檔案大小限制、錯誤訊息, 可參考 (CFileValidator)
View
看看你的controller新增、修改對應的view, 會發現表單的實體是在_form.php這個檔案 (框架預設),
進到_form.php後修改以下code:
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'bnb-form',
'enableAjaxValidation'=>false,
'htmlOptions' => array('enctype' => 'multipart/form-data'), <-新增這行
)); ?>
然後在新增這段, 才會有上傳的按鈕出現
<div class="row">
<?php echo $form->labelEx($model,'dbFieldsOfTheImage'); ?>
<?php echo $form->fileField($model,'dbFieldsOfTheImage'); ?>
<?php echo $form->error($model,'dbFieldsOfTheImage'); ?>
</div>
注意第二個的fileField, 在yii的框架預設下是textField (文字框), 要改成fileField.
Conrtoller
public function actionCreate()
{
$model=new House;
if(isset($_POST['House']))
{
$model->attributes=$_POST['House'];
$imageUploadFile = CUploadedFile::getInstance($model,'houseImg');
$fileName = $imageUploadFile->name;
$model->bnbImg = $fileName;
if($model->save())
$file_path = Yii::app()->basePath.'/../images/house/' . $fileName;
$imageUploadFile->saveAs($file_path);
$this->redirect(array('view', 'id'=>$model->bnbId));
}
$this->render('create',array(
'model'=>$model,
));
}
1. 使用CUploadedFile::getInstance為一個模型屬性生成一個文件輸入框
2. $imageUploadFile->name可以取得檔名 (連同副檔名)
3. saveAs是將上傳的照片從上傳的暫存區移到指定的目錄 (記得要目錄+檔名喔!)
PS:
1. Yii::app()->basePath是取得網站的protected資料夾位置, 如果你的網站建置時取名www, 那就會返回 - 網站在主機的路徑/www/protected. 所以如果你的照片位置在網站根目錄下的images, 那就要用".."返回到上一層, 並進到images資料夾. ex: Yii::app()->basePath.'/../images/
其實用 Yii::getPathOfAlias('webroot')就可以直接取得網站專案名/protected的路徑 - 2014.7.6 補充
2. 測試後發現上傳的資料夾要先建立好, 要不然會出錯 (如果有需要可以自己寫一個建資料夾的程式)
1. Yii::app()->basePath是取得網站的protected資料夾位置, 如果你的網站建置時取名www, 那就會返回 - 網站在主機的路徑/www/protected. 所以如果你的照片位置在網站根目錄下的images, 那就要用".."返回到上一層, 並進到images資料夾. ex: Yii::app()->basePath.'/../images/
其實用 Yii::getPathOfAlias('webroot')就可以直接取得網站專案名/protected的路徑 - 2014.7.6 補充
2. 測試後發現上傳的資料夾要先建立好, 要不然會出錯 (如果有需要可以自己寫一個建資料夾的程式)
沒有留言:
張貼留言