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 相关文章推荐
Zend 输出产生XML解析错误
Mar 03 PHP
php 静态变量的初始化
Nov 15 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 PHP
PHP源码分析之变量的存储过程分解
Jul 03 PHP
destoon数据库表说明汇总
Jul 15 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
PHP5.5新特性之yield理解与用法实例分析
Jan 11 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 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
Terran兵种对照表
2020/03/14 星际争霸
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
JavaScript代码复用模式实例分析
2012/12/02 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
python批量修改文件名的实现代码
2014/09/01 Python
Zabbix实现微信报警功能
2016/10/09 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
解读! Python在人工智能中的作用
2017/11/14 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
中国制造网:Made-in-China.com
2019/10/25 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
制定岗位职责的原则
2013/11/08 职场文书
大学军训感言400字
2014/03/11 职场文书
商场租赁意向书
2014/07/30 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
体育活动总结
2015/02/04 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
签约仪式致辞
2015/07/30 职场文书
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android