cakephp 文件上傳

 原文: http://cakebaker.42dh.com/2006/04/15/file-upload-with-cakephp/

    文章中代碼經過測試: 需要代碼請聯繫 

    這篇文章我將講述如何上傳以及在數據庫中存儲文件,是的,我說的是在數據庫中存儲文件.由於數據庫性能的
原因不推薦在數據庫中保存文件.當然這是在設計應用程序是考慮的重點.
爲什麼要把文件存儲在數據庫中有下面幾個原因:

1. 所有文件存儲在一個地方: 數據庫
2. 易於測試
3. 易於開發,因爲我不必維護數據庫和文件系統的同步問題

 

收先定義MYSQL數據庫表的結構

非常容易,是嗎? 現在我將在數據庫中存儲文件.爲了檢索文件,我需要一個download()方法,把它添加到控制器中:      
顯示文件列表
控制器方法:     

/**
     * 文件下載
     * 
     * @param integer $id 文件id
     * 
     * Usage: uploads/download/1
     
*/
    
function download($id) {
        
// 通過文件Id查詢文件的數據
        
        
$file = $this->Upload->findById($id);
        
header('Content-type: ' . $file['Upload']['type']); // MIME類型
        header('Content-length: ' . $file['Upload']['size']);  // 文件長度(字節)
        header('Content-Disposition: attachment; filename=' . $file['Upload']['name']); // 提示用戶保存文件
        echo $file['Upload']['data'];
        
exit ();
    }

 

// app/views/uploads/filelist.ctp

<table>
<?php 
echo $html->tableHeaders(array_keys($filelist[0]['Upload']));
foreach ($filelist as $file){
 echo $html->tableCells($file['Upload'], array('bgcolor' => 'green','style'=>'color:white;'));
}
?>
</table>

 

/**
     * 顯示文件列表
     * 
     * Usage: uplodas/filelist
     
*/
    
function filelist() {
        
$this->set('filelist', $this->Upload->findAll(null, array (
            
'id',
            
'name',
            
'type',
            
'size',
            
'created',
            
'updated','modified'
        )
, 'id DESC'));
    }

 

CREATE TABLE uploads (
  id 
INT(11NOT NULL AUTO_INCREMENT,
  name 
VARCHAR(75NOT NULL,
  type 
VARCHAR(255NOT NULL,
  size 
INT(11NOT NULL,
  data MEDIUMBLOB 
NOT NULL,
  created 
DATETIME,
  updated 
DATETIME,
  modified 
DATETIME,
  
PRIMARY KEY (id)
);


注意: 除非你明確的知道上傳的文件不會超過64K大小,否則應該使用MEDIUMBLOG或則LONGBLOB數據庫類型.


模型是很直觀的:

// app/models/uploads.php
class Upload extends AppModel
{
    
public $name = 'Upload';
 }

目前我省略了控制器的創建而直接創建視圖

// app/views/uploads/add.ctp
<form action="/uploads/add" enctype="multipart/form-data" method="post">
    
<?php echo $form->file('uploads/File'); ?>
    
<?php echo $html->submit('Upload')); ?>
</form>

現在我準備創建控制器並實現add方法

// app/controllers/files_controller.php
class UploadsController extends AppController{
    
/**
     * 上傳文件
     * 
     * Usage: uploads/add
     
*/
    
function add() {
        
if (!empty ($this->data['uploads']['File']) && is_uploaded_file($this->data['uploads']['File']['tmp_name'])) {
            
// 把文件存入變量
            $this->data['uploads']['File']['data'= fread(fopen($this->data['uploads']['File']['tmp_name'], "r"), $this->data['uploads']['File']['size']);
            
// 同步數據庫
            $this->Upload->save($this->data['uploads']['File']);
        }
        
// debug
        var_dump($this->data['uploads']['File']);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章