zoukankan      html  css  js  c++  java
  • 上传图片(示列分析) $_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

  • 相关阅读:
    Scott Mitchell 的ASP.NET 2.0数据教程
    asp.net单点登录 一个账号只能在一个地方登录
    javascript关键字加亮加连接
    Windows环境变量
    IE支持HTML5的解决方法
    JavaScript test() 方法及判断是否为iPhone|iPad|iPod
    《C#4.0中文视频教程共20课完整版》下载
    DataView.RowFilter 的使用
    SQL Server中如何备份到异机
    完美兼容IE、FF、Opera的Ajax类支持get、post、自定义回调函数
  • 原文地址:https://www.cnblogs.com/hellowzd/p/4142821.html
Copyright © 2011-2022 走看看