ThinkPHP 內建 UploadFile 類與 Image 類,支援檔案上傳、多尺寸縮略圖、水印、刪除原圖等功能。本文提供從資料表建立到完整 Controller 實現的端到端範例。
CREATE TABLE IF NOT EXISTS `tp_image` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image` varchar(200) NOT NULL COMMENT '儲存檔名(不含路徑)',
`create_time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
<?php
return array(
'URL_MODEL' => 2, // PATHINFO 模式
'DB_TYPE' => 'mysql',
'DB_HOST' => 'localhost',
'DB_NAME' => 'thinkphp',
'DB_USER' => 'root',
'DB_PWD' => '',
'DB_PORT' => '3306',
'DB_PREFIX' => 'tp_',
'SHOW_PAGE_TRACE' => true,
// 模板輸出路徑替換:__UPLOAD__ → 站點根目錄/Uploads
'TMPL_PARSE_STRING' => array(
'__UPLOAD__' => __ROOT__ . '/Uploads',
),
);
?>
<?php
class ImageAction extends Action {
// 列表頁:顯示最新上傳圖片及縮略圖
public function index() {
$image = M('Image');
$data = $image->order('create_time DESC')->find();
$this->assign('data', $data);
$this->display();
}
// 上傳入口:表單提交到此
public function upload() {
if (!empty($_FILES)) {
$this->_upload();
}
}
// 核心上傳邏輯
protected function _upload() {
import('@.ORG.UploadFile'); // 導入上傳類
$upload = new UploadFile();
// 基礎配置
$upload->maxSize = 3292200; // ~3.2MB
$upload->allowExts = explode(',', 'jpg,gif,png,jpeg');
$upload->savePath = './Uploads/'; // 相對 index.php
$upload->saveRule = 'uniqid'; // 檔名規則:唯一 ID
// 縮略圖配置 (僅圖片有效)
$upload->thumb = true;
$upload->imageClassPath = '@.ORG.Image'; // Image 類路徑
$upload->thumbPrefix = 'm_,s_'; // 生成兩張:m_中圖、s_小圖
$upload->thumbMaxWidth = '400,100'; // 對應寬度
$upload->thumbMaxHeight = '400,100'; // 對應高度
$upload->thumbRemoveOrigin = true; // 刪除原圖,節省空間
// 執行上傳
if (!$upload->upload()) {
$this->error($upload->getErrorMsg());
}
// 獲取上傳成功檔案資訊
$info = $upload->getUploadFileInfo();
// $info[0] 包含: savepath, savename, size, extension 等
// 給中圖 (m_) 添加水印
import('@.ORG.Image');
$waterMark = APP_PATH . 'Tpl/Public/Images/logo.png'; // 水印圖片路徑
Image::water($info[0]['savepath'] . 'm_' . $info[0]['savename'], $waterMark);
// 寫入資料庫 (只存檔名,路徑由配置統一管理)
$model = M('Image');
$data['image'] = $info[0]['savename'];
$data['create_time'] = NOW_TIME;
if ($model->add($data)) {
$this->success('上傳圖片成功!');
} else {
$this->error('資料庫寫入失敗!');
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>圖片上傳演示</title>
</head>
<body>
<h3>上傳圖片 (支援 jpg/gif/png,生成兩張縮略圖,中圖帶水印,刪除原圖)</h3>
<form action="__URL__/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*" required>
<input type="submit" value="上傳">
</form>
<hr>
<h4>最新上傳結果</h4>
<notempty name="data">
<p>原圖/大圖:<img src="__UPLOAD__/m_{$data.image}" alt="中圖(水印)"></p>
<p>小圖:<img src="__UPLOAD__/s_{$data.image}" alt="小圖"></p>
</notempty>
</body>
</html>
| 屬性 | 作用 | 範例值 |
|---|---|---|
maxSize | 最大檔案大小 (Bytes) | 3292200 |
allowExts | 允許副檔名陣列 | array('jpg','gif','png') |
savePath | 儲存目錄 (相對 index.php) | ./Uploads/ |
saveRule | 檔名生成規則 | uniqid / time / 回調函數名 |
thumb | 啟用縮略圖 | true |
thumbPrefix | 縮略圖前綴 (多個用逗號) | 'm_,s_' → 生成 m_xxx.jpg, s_xxx.jpg |
thumbMaxWidth | 對應前綴最大寬度 | '400,100' |
thumbMaxHeight | 對應前綴最大高度 | '400,100' |
thumbRemoveOrigin | 生成縮略圖後刪除原圖 | true |
imageClassPath | Image 類庫路徑 | '@.ORG.Image' |
// Image::water($srcImage, $waterImage, $pos=9, $alpha=50)
// $pos: 1-9 對應九宮格位置,9=右下角
// $alpha: 透明度 0-100
Image::water('./Uploads/m_abc.jpg', './Public/logo.png', 9, 80);
UploadFile.class.php、Image.class.php;精簡版需從官網下載擴展包放入 Lib/ORG/Uploads/ 目錄需 Web 服務使用者寫入權限 (Linux: chown www:www Uploads && chmod 755 Uploads)php.ini:upload_max_filesize, post_max_size, max_execution_time