新建一个think_photo数据库,库里用sql

  1. CREATE TABLE IF NOT EXISTS `think_photo` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `image` varchar(200) NOT NULL,
  4. `create_time` int(11) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

新建一个项目img,里面有三个部分,App代码部分、Uploads上传部分、index.php入口部分

配置

  1. <?php
  2. return array(
  3. 'URL_MODEL' => 1, // 如果你的环境不支持PATHINFO 请设置为3
  4. 'DB_TYPE' => 'mysql',
  5. 'DB_HOST' => 'localhost',
  6. 'DB_NAME' => 'think_photo',
  7. 'DB_USER' => 'root',
  8. 'DB_PWD' => 'root',
  9. 'DB_PORT' => '3306',
  10. 'DB_PREFIX' => 'think_',
  11. 'TMPL_PARSE_STRING' => array( // 添加输出替换
  12. '__UPLOAD__' => __ROOT__.'/Uploads',
  13. ),
  14. );

显示页面代码

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>ThinkPHP示例:缩略图生成</title>
  6. <style type="text/css">
  7. *{ padding: 0; margin: 0;font-size:16px; font-family: "微软雅黑"}
  8. div{ padding: 3px 20px;}
  9. body{ background: #fff; color: #333;}
  10. h2{font-size:36px}
  11. input,textarea {border:1px solid silver;padding:5px;width:350px}
  12. input{height:30px}
  13. 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}
  14. div.result{border:1px solid #d4d4d4; background:#FFC;color:#393939; padding:8px 20px;float:auto; width:450px;margin:2px}
  15. img {border:1px solid silver;padding:1px;margin:5px}
  16. </style>
  17. </head>
  18. <body>
  19. <div class="main">
  20. <h2>ThinkPHP示例之:图片上传</h2>
  21. <notempty name="data"><img src="__UPLOAD__/m_{$data.image}" /> <img src="__UPLOAD__/s_{$data.image}" /></notempty>
  22. <form id="upload" method='post' action="__URL__/upload/" enctype="multipart/form-data">
  23. <div class="result" >上传允许文件类型:gif png jpg 图像文件,并生成2张缩略图,其中大图带水印,生成后会删除原图。</div>
  24. <input name="image" id="image" type="file" />
  25. <input type="submit" value="提交" class="button" >
  26. </form>
  27. </div>
  28. </body>
  29. </html>

控制器代码

  1. <?php
  2.  
  3. class IndexAction extends Action {
  4.  
  5. public function index() {
  6. $Photo = M('Photo');
  7. $data = $Photo->order('create_time desc')->find();
  8. $this->assign('data', $data);
  9. $this->display();
  10. }
  11.  
  12. public function upload() {
  13. if (!empty($_FILES)) {
  14. //如果有文件上传 上传附件
  15. $this->_upload();
  16. }
  17. }
  18.  
  19. // 文件上传
  20. protected function _upload() {
  21. import('@.ORG.UploadFile');
  22. //导入上传类
  23. $upload = new UploadFile();
  24. //设置上传文件大小
  25. $upload->maxSize = 3292200;
  26. //设置上传文件类型
  27. $upload->allowExts = explode(',', 'jpg,gif,png,jpeg');
  28. //设置附件上传目录
  29. $upload->savePath = './Uploads/';
  30. //设置需要生成缩略图,仅对图像文件有效
  31. $upload->thumb = true;
  32. // 设置引用图片类库包路径
  33. $upload->imageClassPath = '@.ORG.Image';
  34. //设置需要生成缩略图的文件后缀
  35. $upload->thumbPrefix = 'm_,s_'; //生产2张缩略图
  36. //设置缩略图最大宽度
  37. $upload->thumbMaxWidth = '400,100';
  38. //设置缩略图最大高度
  39. $upload->thumbMaxHeight = '400,100';
  40. //设置上传文件规则
  41. $upload->saveRule = 'uniqid';
  42. //删除原图
  43. $upload->thumbRemoveOrigin = true;
  44. if (!$upload->upload()) {
  45. //捕获上传异常
  46. $this->error($upload->getErrorMsg());
  47. } else {
  48. //取得成功上传的文件信息
  49. $uploadList = $upload->getUploadFileInfo();
  50. import('@.ORG.Image');
  51. //给m_缩略图添加水印, Image::water('原文件名','水印图片地址')
  52. Image::water($uploadList[0]['savepath'] . 'm_' . $uploadList[0]['savename'], APP_PATH.'Tpl/Public/Images/logo.png');
  53. $_POST['image'] = $uploadList[0]['savename'];
  54. }
  55. $model = M('Photo');
  56. //保存当前数据对象
  57. $data['image'] = $_POST['image'];
  58. $data['create_time'] = NOW_TIME;
  59. $list = $model->add($data);
  60. if ($list !== false) {
  61. $this->success('上传图片成功!');
  62. } else {
  63. $this->error('上传图片失败!');
  64. }
  65. }
  66. }

改下水印

路径分析

上传功能的实现原理

选择文件

<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

  1. $_files["file"]["name"] - 被上传文件的名称
  2. $_files["file"]["type"] - 被上传文件的类型
  3. $_files["file"]["size"] - 被上传文件的大小,以字节计
  4. $_files["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
  5. $_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

上传图片(示列分析) $_FILES的更多相关文章

  1. ServiceStack Web Service 创建与调用简单示列

    目录 ServiceStack 概念 ServiceStack Web Service 创建与调用简单示列 上篇文章介绍了ServiceStack是什么,本章进入主题,如何快速简单的搭建Service ...

  2. systemd的新特性及unit常见类型分析与awk用法示列

    简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理 系统引导的新特性 系统引导时实现服务启动: 按需激活进程: 系统状态快照: ...

  3. java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

    java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列 package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象 ...

  4. 智能提示含查询多列(html+JS+handler+ HttpRemoting)一、html示列 加 JS加 请求 Handler

    <html> <head> </head> <body> <form id="recordform" name="r ...

  5. TSQL--标示列、GUID 、序列

    --1. IDENTIY 列不能为空,不能设默认值,创建后不能使用ALTER TABLE TableName ALTER COLUMN修改,每张表只能有一个自增列--2. 查看当前值:SELECT I ...

  6. mysql优化----explain的列分析

    sql语句优化: : sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 等待时间:看是不是被锁住了,那就不是语句层面了是服务端层面了,看连接数内存. 执行时间:到底取出多少行,一次性取出1万 ...

  7. H3C路由器配置示列一

    说明: 如上图所示,192.168.0.0网段是总公司的网络,192.168.3.0和192.168.4.0网段是当前自己分公司的网络,且192.168.3.0是内网不能访问互联网,192.168.4 ...

  8. Struts2中上传图片案列

    1.HTML代码 <body> <!--上传一个文件   enctype="multipart/form-data" 上传文件必须设置这个属性和属性值--> ...

  9. Activemq 平台搭建与C#示列

    ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS ...

随机推荐

  1. 管道读写规则和Pipe Capacity、PIPE_BUF

    一.当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止. O_NONBLOCK enable:read调用返回-1,errno值为EAGA ...

  2. Linux内存初始化(一)

    一.前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每一个细节全方位的展现给观众.另外一种就是快镜头,多半是反应一个时代的变迁,从非常长的时间段中,截取几个典型的snapshot,合成 ...

  3. Unix环境高级编程(六)进程控制

    本章介绍Unix的进程控制,包括进程创建,执行程序和进程终止,进程的属性,exec函数系列,system函数,进程会计机制. 1.进程标识符 每一个进程都有一个非负整数标识的唯一进程ID.ID为0表示 ...

  4. python科学计算基础知识

    1.导入基本函数库 import numpy as np 2.获取矩阵元素字节数 a=np.array([1,2,3],dtype=np.float32) a.itemsizeoutput: 4 3. ...

  5. html中如何让table显示的更好

    在html文件编写中,经常使用到table来做一些表格.如何让它显示的更像一张表格?接下来为你讲解. 基本格式 <div> <th>我的一张表格</th> < ...

  6. scrapy 的框架的安装

    1.简介: scrapy 是用python写成的一个web 爬虫框架,scrapy 会把大多数在爬取网站时的通用的事给自动化的做了:我最开始爬别人的网站的时候 用的是requests这个库,用这个库我 ...

  7. Viso Professional 2013版本激活(office 系列产品 -- visio 2013 / project 2013 破解工具 - KMSpico)

    背景: 环境是 win7, 64 bit 装了 visio 2013 , 可以却不能用它来画图,在网上找了一些破解工具,大都不能解决问题.网上不靠谱的广告型文章太多了,比较头痛. 所幸,终于找到正确的 ...

  8. 【Android】16.4 IntentService类

    分类:C#.Android.VS2015: 创建日期:2016-03-01 一.简介 为了进一步简化Intent过滤器的用法,Android系统又提供了一个IntentService类,这样一来,你也 ...

  9. python学习之str.lstrip()

    str.lstrip([chars]) 删除从开头开始指定的字符串,然后返回结果字符串. >>> '://www.example.com'.lstrip('w://') '.exam ...

  10. 【Javascript】Javascript横向/纵向合并单元格TD

    > 需求是这样滴(>_<) 在报表系统中,涉及“HTML的TD单元格的合并”恐怕为数不少. 比如,从DB查得数据并经过后台的整理后,可能是这样的: Table1     JOB TO ...