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小技巧搜集,每个PHPer都来露一手
Jan 02 PHP
PHP 检查扩展库或函数是否可用的代码
Apr 06 PHP
PHP的几个常用数字判断函数代码
Apr 24 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
php里array_work用法实例分析
Jul 13 PHP
php简单统计中文个数的方法
Sep 30 PHP
php查询内存信息操作示例
May 09 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
Jun 14 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 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
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
Symfony的安装和配置方法
2016/03/17 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
js 判断 enter 事件
2009/02/12 Javascript
一个javascript图片阅览组件
2010/11/09 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
简化vuex的状态管理方案的方法
2018/06/02 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
python实现Flappy Bird源码
2018/12/24 Python
关于python多重赋值的小问题
2019/04/17 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
造价工程师个人求职信
2013/09/21 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
心理健康课教学反思
2014/02/13 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
2014年安全员工作总结
2014/11/13 职场文书
实施意见格式范本
2015/06/05 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫