php文件上传原理与实现方法详解


Posted in PHP onDecember 20, 2019

本文实例讲述了php文件上传原理与实现方法。分享给大家供大家参考,具体如下:

文件上传实际上就是在前段使用一个form表单提交本地文件到服务器,然后在服务器端将文件从临时目录转移到指定目录的过程。

1、php配置文件

php.ini文件中的file uploads部分定义了相关文件上传配置,

  • file_uploads = On 打开文件上传
  • upload_tmp_dir =临时目录
  • upload_max_filesize = 2M最大上传大小
  • max_file_uploads = 20单次最大上传文件数

2、前端表单

<form action="test.php" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="submit" value="上传">
  </form>

当使用由文件上传控件的表单时,必须将form的enctype设置为"multipart/form-data"。

可以在客户端对上传文件的大小与类型进行限制:

<input type="hidden" name="MAX_FILE_SIZE" value="8096">
<input type="file" name="myfile" accept="image/jpeg,image/png">

3、后台处理

上传后会在服务器端得到一个$_FILES文件数组如下:

php文件上传原理与实现方法详解

上传到服务器的临时文件默认保存在php.ini中upload_tmp_dir所设置的目录下,我们需要将文件移动到指定位置:

<?php
  header('Content-type:text/html;charset=utf-8');
  $myfile=$_FILES['myfile'];
  //获取文件数组['myfile']的属性tmp_name与name
  $tmp=$myfile['tmp_name'];
  $picname=$myfile['name'];
  //windows采用GBK编码,php采用utf-8编码,需要改变文件名的编码格式
  $picname=iconv('utf-8','GBK',$picname);
  //将零时文件$tmp移动到指定目录userpic并命名为$picname
  copy($tmp,"userpic/".$picname);

file_uploads=On 开启HTTP上传
upload_tmp_dir 临时文件保存目录
upload_max_filesize=2M 最大上传文件大小
post_max_size=8M POST方式传输最大数据值
max_file_uploads 一次上传最大文件数
memory_limit=128M 单线程最大内存占用量
max_excution_time=-1 脚本解析所允许的最大执行时间(s),默认为-1未开启

4、错误处理

对file数组中的error属性进行判断处理:

$error=$myfile['myfile']['error'];
  if ($error==0){//为0,代表上传成功
    if (move_uploaded_file($tmp,"userpic/".$picname)) {
      echo "移动文件成功";
    }else{
      echo "移动文件失败";
    }
  }else{//不为0,匹配错误信息
    switch ($error){
      case 1:
        echo "超过文件最大上传限制";//php.ini中upload_max_filesize
        break;
      case 2:
        echo "超过表单文件大小限制";//HTML表单中MAX_FILE_SIZE选项
        break;
      case 3:
        echo "文件部分被上传";
        break;
      case 4:
        echo "未选择上传文件";
        break;
      case 7://文件写入失败
      case 8:
        echo "系统错误";
        break;
    }
  }

5、上传限制

在前端可以对上传的文件类型,大小进行限制:

<!--表单隐藏域对上传大小进行限制-->
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<!--accept 对文件类型限制-->
<input type="file" name="myfile" accept="image/jpeg,image/png">

注意限制是以字节为单位

在服务器端也要做响应的限制:

$size=$myfile['size'];//获取文件大小
$MaxSize=2097152;//设置最大允许字节
$type=$myfile['type'];//获取图片类型
$AllowTypr=array('image/jpeg','image/png','image/gif');//允许类型数组
if ($error==0){//为0,代表上传成功
  if ($size>$MaxSize){
    echo "<script>alert('文件大小超过限制');</script>";
    echo "<script>history.back(1);</script>";
    exit();
  }
  if (!in_array($type,$AllowTypr)){
    echo "<script>alert('请上传正确图片类型');</script>";
    echo "<script>history.back(1);</script>";
    exit();
  }

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
十天学会php之第九天
Oct 09 PHP
php array_slice函数的使用以及参数详解
Aug 30 PHP
PHP入门学习笔记之一
Oct 12 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
May 29 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
Jun 09 PHP
PHP实现显示照片exif信息的方法
Jul 11 PHP
本地计算机无法启动Apache故障处理
Aug 08 PHP
PHP通过API获取手机号码归属地
May 28 PHP
php图片添加文字水印实现代码
Mar 15 PHP
php微信公众号开发模式详解
Nov 28 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 #PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 #PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 #PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 #PHP
Laravel框架处理用户的请求操作详解
Dec 20 #PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 #PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 #PHP
You might like
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
PHP加密技术的简单实现
2016/09/04 PHP
PHP类型约束用法示例
2016/09/28 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
javascript常用方法总结
2015/05/14 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
python简单获取数组元素个数的方法
2015/07/13 Python
详解Python进程间通信之命名管道
2017/08/28 Python
python interpolate插值实例
2020/07/06 Python
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
Java编程面试题
2016/04/04 面试题
小学生家长评语集锦
2014/01/30 职场文书
小学班级口号
2014/06/09 职场文书
代领毕业证委托书
2014/08/02 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
地方课程教学计划
2015/01/19 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书
ORACLE中dbms_output.put_line输出问题的解决过程
2022/06/28 Oracle