PHP实现本地图片上传和验证功能


Posted in Javascript onFebruary 27, 2017

今天研究了一下PHP的FILES函数,使用PHP实现本地图片的上传,验证文件是否为图片,并将图片保存在指定目录下,实现游览图片的功能,感觉还是很好玩的,一共有两个PHP页面,一个作为前台的上传和图片展示,另一个用来处理保存图片,代码里做了很详细的注释,并将FILES函数的语法,error报错类型写了出来,还有一些注意事项。

FILES函数

1、$_FILES[‘myFile'][‘name'] 客户端文件的原名称
2、$_FILES[‘myFile'][‘type'] 文件的 MIME类型,需要浏览器提供该信息的支持,例如”image/gif”
3、$_FILES[‘myFile'][‘size'] 已上传文件的大小,单位为字节
4、$_FILES[‘myFile'][‘tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认,可以在php.ini的upload_tmp_dir指定

关于FILES中error报错类型及其注意:

过滤错误号

0: 没有错误发生,文件上传成功
1: 上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值
2: 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值
3: 文件只有部分被上传
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]获取文件信息时会报异常。

以下是代码

index.php

<?php
 header("Content-Type:text/html;charset=utf-8");
 ?>
 <title>PHP实现图片的上传和验证</title>
 <style>
 table{text-align:center;}
 </style>
 <div align="center">
 <h1>上传功能</h1>
 <form action="index_ok.php" method="post" enctype="multipart/form-data">
  上传图片:<input type="file" name="pic">
  <input type="submit" name="sub" value="上传">
 </form>
 <table width="500">
  <tr bgcolor="#cccccc">
  <th>序号</th>
  <th>图片</th>
  <th>添加时间</th>
  <th>操作</th>
  </tr>
  <?php
  //1 打开目录
  $dir=opendir("./uploads");
  //2 遍历目录,输出里面的图片
  $i=0;
  while($f=readdir($dir)){
   $i++;
   //读取目录中的文件,模拟数据库操作
   if($f!="." && $f!=".."){
    $filename="./uploads/$f";
    echo "<tr>";
    echo "<td>{$i}</td>";
    echo "<td><img src='./uploads/{$f}' width='80' height='60'></td>";
    echo "<td>".date("Y-m-d",filectime($filename))."</td>";
    echo "<td><a href='./uploads/{$f}'>查看</a></td>";
    echo "</tr>";
   }
  }
  //3 关闭目录
  closedir($dir);
  ?>
 <tr bgcolor="#cccccc"><td colspan="4"> </td></tr>
 </table>
 </div>

upload.php

<?php
 header("Content-Type:text/html;charset=utf-8");
  if($_FILES['pic']['error']>0){
   echo $_FILES['pic']['error'];
   echo "上传文件错误!";
   echo '<meta http-equiv="refresh" content="3;url=index.php">'; //自动跳转回index文件
  }else{
   //开始获取上传文件的信息
   $file=$_FILES['pic'];
   //var_dump($file);打印文件里的全部信息
   //name:上传文件名
   //type:上传文件的类型
   //tmp_name:上传成功后的临时文件
   //size:上传文件的大小
   //error:上传文件的错误信息
   $uploaddir="./uploads/"; //选择要上传的文件存放目录
   //$uploadfile=$uploaddir.basename($file['name']);//获得上传文件的名称
   //解析文件的名字
   $fileinfo=pathinfo($file['name']);
 //  echo $fileinfo['extension']; 获取文件的类型
   do{
    $newfile=date("YmdHis").rand(1000,9999).".".$fileinfo['extension'];//更改文件的名字,获取一个新的名字
   }while(file_exists($uploaddir.$newfile));

   //上传文件的类型限制
   if (!(($file['type'] == "image/gif")||($file['type'] == "image/jpeg")||($file['type'] == "image/pjpeg"))){
    die("文件类型错误!");
    echo '<meta http-equiv="refresh" content="3;url=index.php">';
   }
   //上传文件的大小限制
   if($file['size'] > 2*1024*1024){
    die("上传文件超过2MB!");
    echo '<meta http-equiv="refresh" content="3;url=index.php">';
   }
   //开始上传文件
   if (is_uploaded_file($file['tmp_name'])) {
    if (move_uploaded_file($file['tmp_name'], $uploaddir.$newfile)) {
     echo "上传成功!";
     echo '<meta http-equiv="refresh" content="3;url=index.php">';//自动跳转回index文件
    } else {
     echo "上传失败,请稍等!";
     echo '<meta http-equiv="refresh" content="3;url=index.php">'; //自动跳转回index文件
    }
   }

  }
 ?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
javascript 不间断的图片滚动并可点击
Jan 15 Javascript
js保存当前路径(cookies记录)
Dec 14 Javascript
js禁止回车提交表单的示例代码
Dec 23 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
Aug 30 Javascript
JavaScript中用字面量创建对象介绍
Dec 31 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
关于vue-router路径计算问题
May 10 Javascript
微信小程序使用wxParse解析html的实现示例
Aug 30 Javascript
cdn模式下vue的基本用法详解
Oct 07 Javascript
Vue拖拽组件列表实现动态页面配置功能
Jun 17 Javascript
JavaScript仿京东轮播图效果
Feb 25 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
Feb 27 #Javascript
提高Web性能的前端优化技巧总结
Feb 27 #Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
Feb 27 #Javascript
node.js入门教程之querystring模块的使用方法
Feb 27 #Javascript
JavaScript中数组Array方法详解
Feb 27 #Javascript
从零学习node.js之详解异步控制工具async(八)
Feb 27 #Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 #Javascript
You might like
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
PHP闭包实例解析
2014/09/08 PHP
php的curl封装类用法实例
2014/11/07 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
浅析Python中的序列化存储的方法
2015/04/28 Python
python实现中文分词FMM算法实例
2015/07/10 Python
Python中属性和描述符的正确使用
2016/08/23 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
python中学习K-Means和图片压缩
2017/11/20 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
Python判断有效的数独算法示例
2019/02/23 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
如何开启linux的ssh服务
2015/02/14 面试题
物业管理个人自我评价
2013/11/08 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS