新建一个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

上传图片(示列分析) $_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. Linux进程地址空间和虚拟内存

    一.虚拟内存 先来看一张图(来自<Linux内核完全剖析>),如下: 分段机制:即分成代码段,数据段,堆栈段.每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低 ...

  2. bootstrap 多元素共用 popover

    <div class="popover fade bottom in small" role="tooltip" id="gPopover&qu ...

  3. Tomcat7 catalina.out 日志切割

    安装步骤例如以下: 下载(最新版本号)     #  wget http://cronolog.org/download/cronolog-1.6.2.tar.gz 假设下载不了,直接网上查找,ftp ...

  4. C#--类成员

    数据成员: 字段: 常量: 函数成员(执行代码): 方法: 属性 构造函数 析构函数 运算符 索引 事件 可以被声明为Static的类成员是:

  5. hive sql 行列转换

    -- 对一张大表的每一行,后面加多种label值 -- 其实就是笛卡尔积,举例 -- SELECT * FROM dev.dev_jiadian_user_yuge_temp -- CROSS JOI ...

  6. cocos2dx 3.x避免空customCommand

    1,导致性能悲剧的写法: class A:public CCNode{ public: A(){ m_sprite=NULL; m_isDrawDebug=false; } virtual~A(){} ...

  7. [na]tcpdump参数应用参考

    详细参数参考,我记得之前有个ppt关于这个写的不错. 说实话,这玩意用的时候直接gg了. 常用应用: 过滤物理口 过滤某个port/ip/mac 过滤协议 显示ip/mac/port不解析等 一 tc ...

  8. GCC实现多文件编译,静态库,动态库

    一 代码 //add.h int add(int a, int b); //add.c int add(int a, int b) {     return a+b; } //main.c #incl ...

  9. CCTableView(一)

    #ifndef __TABLEVIEWTESTSCENE_H__ #define __TABLEVIEWTESTSCENE_H__ #include "cocos2d.h" #in ...

  10. The Ultimate List of Open Source Static Code Analysis Security Tools

    https://www.checkmarx.com/2014/11/13/the-ultimate-list-of-open-source-static-code-analysis-security- ...