thinkphp实现图片上传功能分享


Posted in PHP onMarch 04, 2014

1.我们首先需要创建一个表

CREATE TABLE IF NOT EXISTS `tp_image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `image` varchar(200) NOT NULL,
  `create_time` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

2.然后再conf文件里添加配置(最后一段配置是可选的,只是为了方便统一管理URL路径)

<?php
return array(
        'URL_MODEL'    =>    2, // 如果你的环境不支持PATHINFO 请设置为3
        'DB_TYPE'    =>    'mysql',
        'DB_HOST'    =>    'localhost',
        'DB_NAME'    =>    'thinkphp',
        'DB_USER'    =>    'root',
        'DB_PWD'    =>    '',
        'DB_PORT'    =>    '3306',
        'DB_PREFIX'    =>    'tp_',        'SHOW_PAGE_TRACE' =>true,        //显示页面调试明细
        'TMPL_PARSE_STRING' =>  array( // 地址替换,用_UPLOAD_目录 代替 根目录下的Upload目录
         '__UPLOAD__'    =>  __ROOT__.'/Uploads',
     ),
);
?>

3.添加一个Image模块(名字可以随便取)

<?php
    class ImageAction extends Action{                /**
         * 创建index 入口方法
         */
        public function index(){
            $image=M('Image');                       
            $data=$image->order('create_time desc')->find();    //获取最后上传图片
            $this->assign('data',$data);
            $this->display();
        } 
?>

4.创建相应index视图文件(index.html)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
    #img{height:22px; border:#000 2px solid}
    #button{height:30px; width:100px;}
</style>
</head>
<body>
    <div class="result" >上传允许文件类型:gif png jpg 图像文件,并生成2张缩略图,其中大图带水印,生成后会删除原图。</div><br>
    <notempty name="data"><img src="__UPLOAD__/m_{$data.image}" /> <img src="__UPLOAD__/s_{$data.image}" /></notempty>
    <form action="__URL__/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="image" id="img"/>
        <input type="submit" value="上传" id="button"> 
    </form>
</body>
</html>

5.选择图片,点击上传按钮后,会跳到Image模块的upload方法上,Image模块上现在还没有这个方法,于是我们创建它

<?php
    class ImageAction extends Action{                /**
         * 创建index 入口方法
         */
        public function index(){
            $image=M('Image');                        
            $data=$image->order('create_time desc')->find();    //获取最后上传图片
            var_dump($data);
            $this->assign('data',$data);
            $this->display();
        } 
        //如果上传的文件不为空,跳转到_upload方法
        public function upload(){        
            //如果不为空
            if(!empty($_FILES))
            {
                $this->_upload();
            }
        }

6.如果提交的不是NULL,则跳到_upload方法上,此方法实现图片上传的功能

<?php
    class ImageAction extends Action{                /**
         * 创建index 入口方法
         */
        public function index(){
            $image=M('Image');                        
            $data=$image->order('create_time desc')->find();    //获取最后上传图片
            var_dump($data);
            $this->assign('data',$data);
            $this->display();
        } 
        
        //如果上传的文件不为空,跳转到_upload方法
        public function upload(){        
            //如果不为空
            if(!empty($_FILES))
            {
                $this->_upload();
            }
        }
        
        /***
         * 实现图片上传
         */
        public function _upload(){
            import('@.ORG.UploadFile');
            //导入上传类
            $upload = new UploadFile();
            //设置上传文件大小
            $upload->maxSize            = 3292200;
            //设置上传文件类型
            $upload->allowExts          = explode(',', 'jpg,gif,png,jpeg');
            //设置附件上传目录
            $upload->savePath           = './Uploads/';
            //设置需要生成缩略图,仅对图像文件有效
            $upload->thumb              = true;
            // 设置引用图片类库包路径
            $upload->imageClassPath     = '@.ORG.Image';
            //设置需要生成缩略图的文件后缀
            $upload->thumbPrefix        = 'm_,s_';  //生产2张缩略图
            //设置缩略图最大宽度
            $upload->thumbMaxWidth      = '400,100';
            //设置缩略图最大高度
            $upload->thumbMaxHeight     = '400,100';
            //设置上传文件规则
            $upload->saveRule           = 'uniqid';
            //删除原图
            $upload->thumbRemoveOrigin  = true;
            
            //如果上传不成功
            if (!$upload->upload()) 
            {
                //捕获上传异常
                $this->error($upload->getErrorMsg());
            } 
            else 
            {
                //取得成功上传的文件信息
                $uploadList = $upload->getUploadFileInfo();
                
                //导入图片类
                import('@.ORG.Image');                
                //给m_缩略图添加水印, Image::water('原文件路径','水印图片地址')
                Image::water($uploadList[0]['savepath'] . 'm_' . $uploadList[0]['savename'], APP_PATH.'Tpl/Public/Images/logo.png');
                //图片名赋值给 字段image
                $_POST['image'] = $uploadList[0]['savename'];
            }
            $model  = M('image');
            //保存当前数据对象
            $data['image']          = $_POST['image'];
            $data['create_time']    = NOW_TIME;
            $list   = $model->add($data);
            if ($list !== false) 
            {
                $this->success('上传图片成功!');
            } 
            else 
            {
                $this->error('上传图片失败!');
            }
        }        
    }
?>

上传成功生成两张缩略图

需要说明的是:

ThinkPHP里自带的图片上传类(UploadFile.class.php) 和图片模型类(Image.class.php),要完整版的ThinkPHP包才有。

没有的话需要在Lib里创建一个文件夹(ORG),然后去官网下载扩展包把这两个文件放到ORG文件夹中。

我的是第二种情况

PHP 相关文章推荐
PHP的类 功能齐全的发送邮件类
Oct 09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
php代码架构的八点注意事项
Jan 25 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
Mar 06 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
Yii统计不同类型邮箱数量的方法
Oct 18 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
May 17 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 PHP
php判断是否为json格式的方法
Mar 04 #PHP
php不写闭合标签的好处
Mar 04 #PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 #PHP
PHP中is_file不能替代file_exists的理由
Mar 04 #PHP
php获取目标函数执行时间示例
Mar 04 #PHP
PHP代码优化的53个细节
Mar 03 #PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 #PHP
You might like
phpmyadmin的#1251问题
2006/11/25 PHP
php字符串截取问题
2006/11/28 PHP
js代码实现微博导航栏
2015/07/30 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
2020/01/12 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
从零学Python之入门(四)运算
2014/05/27 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
Python数据处理numpy.median的实例讲解
2018/04/02 Python
python缩进长度是否统一
2020/08/02 Python
制冷与电控专业应届生求职信
2013/11/11 职场文书
优秀求职信范文分享
2013/12/19 职场文书
考试退步检讨书
2014/01/15 职场文书
酒店管理毕业生自我鉴定
2014/03/02 职场文书
工程售后服务承诺书
2014/05/21 职场文书
优秀大学生自荐信
2015/03/26 职场文书
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby