首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP UploadFile 類實現圖片上傳、縮略圖生成、水印添加完整實例

     編輯:PHP 相關知識

ThinkPHP UploadFile 類實現圖片上傳、縮略圖生成、水印添加完整實例

ThinkPHP 內建 UploadFile 類與 Image 類,支援檔案上傳、多尺寸縮略圖、水印、刪除原圖等功能。本文提供從資料表建立到完整 Controller 實現的端到端範例。

1. 資料表結構

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;

2. 配置檔 (Conf/config.php)

<?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',
    ),
);
?>

3. ImageAction 完整實現

<?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('資料庫寫入失敗!');
        }
    }
}
?>

4. 模板檔案 (Tpl/Image/index.html)

<!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
imageClassPathImage 類庫路徑'@.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);

部署注意事項

  • 完整版 ThinkPHP 才內建 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved