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 相关文章推荐
jQuery 浮动广告实现代码
Dec 25 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
Dec 27 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
基于jquery实现的自动补全功能
Mar 12 Javascript
JQuery球队选择实例
May 18 Javascript
实用jquery操作表单元素的简单代码
Jul 04 Javascript
Vue.js一个文件对应一个组件实践
Oct 27 Javascript
Node.js简单入门前传
Aug 21 Javascript
解决vue接口数据赋值给data没有反应的问题
Aug 27 Javascript
浅谈vue后台管理系统权限控制思考与实践
Dec 19 Javascript
JQuery事件委托原理与用法实例分析
May 13 jQuery
javascript实现简单留言板案例
Feb 09 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
PHP Stream_*系列函数
2010/08/01 PHP
PHP之COOKIE支持详解
2010/09/20 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
报关简历自我评价怎么写
2013/09/19 职场文书
大学生毕业的自我鉴定
2013/11/13 职场文书
求职信范文英文版
2014/01/05 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python