上传图片(示列分析) $_FILES
新建一个think_photo数据库,库里用sql
CREATE TABLE IF NOT EXISTS `think_photo` ( `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;
新建一个项目img,里面有三个部分,App代码部分、Uploads上传部分、index.php入口部分
配置
<?php return array( 'URL_MODEL' => 1, // 如果你的环境不支持PATHINFO 请设置为3 'DB_TYPE' => 'mysql', 'DB_HOST' => 'localhost', 'DB_NAME' => 'think_photo', 'DB_USER' => 'root', 'DB_PWD' => 'root', 'DB_PORT' => '3306', 'DB_PREFIX' => 'think_', 'TMPL_PARSE_STRING' => array( // 添加输出替换 '__UPLOAD__' => __ROOT__.'/Uploads', ), );
显示页面代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ThinkPHP示例:缩略图生成</title> <style type="text/css"> *{ padding: 0; margin: 0;font-size:16px; font-family: "微软雅黑"} div{ padding: 3px 20px;} body{ background: #fff; color: #333;} h2{font-size:36px} input,textarea {border:1px solid silver;padding:5px;width:350px} input{height:30px} input.button,input.submit{width:68px; margin:2px 5px;letter-spacing:4px;font-size:16px; font-weight:bold;border:1px solid silver; text-align:center; background-color:#F0F0FF;cursor:pointer} div.result{border:1px solid #d4d4d4; background:#FFC;color:#393939; padding:8px 20px;float:auto; width:450px;margin:2px} img {border:1px solid silver;padding:1px;margin:5px} </style> </head> <body> <div class="main"> <h2>ThinkPHP示例之:图片上传</h2> <notempty name="data"><img src="__UPLOAD__/m_{$data.image}" /> <img src="__UPLOAD__/s_{$data.image}" /></notempty> <form id="upload" method='post' action="__URL__/upload/" enctype="multipart/form-data"> <div class="result" >上传允许文件类型:gif png jpg 图像文件,并生成2张缩略图,其中大图带水印,生成后会删除原图。</div> <input name="image" id="image" type="file" /> <input type="submit" value="提交" class="button" > </form> </div> </body> </html>
控制器代码
<?php class IndexAction extends Action { public function index() { $Photo = M('Photo'); $data = $Photo->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; //设置上传文件类型 $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'); $_POST['image'] = $uploadList[0]['savename']; } $model = M('Photo'); //保存当前数据对象 $data['image'] = $_POST['image']; $data['create_time'] = NOW_TIME; $list = $model->add($data); if ($list !== false) { $this->success('上传图片成功!'); } else { $this->error('上传图片失败!'); } } }
改下水印
路径分析
上传功能的实现原理
选择文件
<input name="image" id="image" type="file" />
获取选择文件的地址
<input name="image" id="image" type="file" />
<input type="submit" value="提交" class="button" >
提交图片的地址
<form id="upload" method='post' action="__URL__/upload/" enctype="multipart/form-data">
__URL__/upload/会被解析成什么?
找Index控制器里的upload方法
如果有文件,找_upload方法
那么,显示页面post出的数据去哪了?
控制器里
有用搜索搜索了一下
第一个是应该是负责保存图片的,因为第二个是保存的图片路径到数据库
没有直接把图片放数据库里
那么 $_POST['image'] = $uploadList[0]['savename'];
$uploadList[0]['savename']是什么意思呢?
找到ORG文件
找uploadFileInfo,看看都是谁会用到它
、
还有
isupload、fileinfo
最后会得到$file,先记住它,再看看php是怎么上传图片的
http://www.w3school.com.cn/php/php_file_upload.asp
PHP 临时文件夹创建了一个被上传文件的临时副本。
这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置。
第一个参数是表单的 input name,第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:
- $_FILES["file"]["name"] - 被上传文件的名称
- $_FILES["file"]["type"] - 被上传文件的类型
- $_FILES["file"]["size"] - 被上传文件的大小,以字节计
- $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
- $_FILES["file"]["error"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制。
等等
再看一下控制器代码
联系ORG代码
PHP中$_FILES的使用及注意事项
$_FILES: 经由 HTTP POST 文件上传而提交至脚本的变量。类似于旧数组 $HTTP_POST_FILES 数组(依然有效,但反对使用)。详细信息可参阅 POST 方法上传。
$_FILES数组内容如下:
$_FILES['myFile']['name'] 客户端文件的原名称。
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但用 putenv() 函数设置是不起作用的。
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)
UPLOAD_ERR_OK 值:0; 没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE 值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE 值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL 值:3; 文件只有部分被上传。
UPLOAD_ERR_NO_FILE 值:4; 没有文件被上传。 值:5; 上传文件大小为0.
注:
1. 文件被上传结束后,默认地被存储在了临时目录中,这时必须将它从临时目录中删除或移动到其它地方,如果没有,则会被删除。也就是不管是否上传成功,脚本执行完后临时目录里的文件肯定会被删除。所以在删除之前要用PHP的 copy() 函数将它复制到其它位置,此时,才算完成了上传文件过程。
2. 在 PHP 4.1.0 版本以前该数组的名称为 $HTTP_POST_FILES,它并不像 $_FILES 一样是自动全局变量。PHP 3 不支持 $HTTP_POST_FILES 数组。
3. 用form上传文件时,一定要加上属性内容 enctype="multipart/form-data",否则用$_FILES[filename]获取文件信息时会报异常。
<form enctype="multipart/form-data" action="URL" method="post">
<input name="myFile" type="file">
<input type="submit" value="上传文件">
</form>
http://blog.sina.com.cn/s/blog_3cdfaea201008utf.html
$_files["file"]["name"] - 被上传文件的名称 $_files["file"]["type"] - 被上传文件的类型 $_files["file"]["size"] - 被上传文件的大小,以字节计 $_files["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称 $_files["file"]["error"] - 由文件上传导致的错误代码
php文件上传之$_FILES全局变量用法介绍
我们来看看files的变量的用法
$_FILES超级全局变量很特殊,他是预定义超级全局数组中唯一的二维数组。其作用是存储各种与上传文件有关的信息,这些信息对于通过PHP脚本上传到服务器的文件至关重要。此函数中总共有5项:
1.$_FILES["userfile"]["error"]
$_FILES["userfile"]["error"]数组值提供了与上传尝试结果有关的重要信息。总共有5个不同的返回值,其中一个表示成功的结果,另外4个表示在尝试中出现的特殊错误。灭个返回值的名字和将在后面介绍。
2.$_FILES["userfile"]["name"]
$_FILES["userfile"]["name"]变量指定客户端机器上声明的文件最初的名字,包括扩展名。因此,如果浏览器一个名为vacation.jpg的文件,并通过表单上传,则此变量的值将是vacation.png。
3.$_FILES["userfile"]["size"]
$_FILES["userfile"]["size"]变量指定从客户端上传的文件的大小,以字节为单位。因此,在vacation.jpg文件的例子中,此函数可能赋值为5253,大约为5kb.
4. $_FILES["userfile"]["tmp_name"]
$_FILES["userfile"]["tmp_name"]变量指定上传到服务器后为文件赋予的临时名。这是存储在临时目录(由PHP指令upload_tmp_dir指定)中时所指定的文件名。
5. $_FILES["userfile"]["type"]
$_FILES["userfile"]["type"]变量指定从客户端上传的文件的mime类型。因此,在vacation.jpg文件的例子中,此变量会赋值为image/jpeg。如果上传的是PDF,则赋值为application/pdf。因为这个变量有时会得到意外的结果,所以应当在脚本中显示地进行验证。
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)
UPLOAD_ERR_OK
值:0; 没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE
值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE
值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL
值:3; 文件只有部分被上传。
UPLOAD_ERR_NO_FILE
值:4; 没有文件被上传。
值:5; 上传文件大小为0.
http://www.php100.com/html/php/hanshu/2013/0905/4666.html