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 相关文章推荐
表单提交验证类
Jul 14 Javascript
JS 创建对象(常见的几种方法)
Nov 03 Javascript
JavaScript入门教程(1) 什么是JS
Jan 31 Javascript
JS实战篇之收缩菜单表单布局
Dec 10 Javascript
js for循环倒序输出数组元素的实例
Mar 01 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
JS+DIV实现的卷帘效果示例
Mar 22 Javascript
浅谈angular.copy() 深拷贝
Sep 14 Javascript
vue+vue-validator 表单验证功能的实现代码
Nov 13 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
JavaScript或jQuery 获取option value值方法解析
May 12 jQuery
vue+Element中table表格实现可编辑(select下拉框)
May 21 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
图形数字验证代码
2006/10/09 PHP
PHP4实际应用经验篇(4)
2006/10/09 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
python 日期操作类代码
2018/05/05 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
numpy数组广播的机制
2019/07/12 Python
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
精通CAD能手自荐书
2014/01/31 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
MySQL索引是啥?不懂就问
2021/07/21 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript