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 相关文章推荐
Windows下安装Memcached的步骤说明
Apr 25 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
php查询ip所在地的方法
Dec 05 PHP
php+ajax实时输入自动搜索匹配的方法
Dec 26 PHP
php实现随机显示图片方法汇总
May 21 PHP
PHP模拟asp中response类实现方法
Aug 08 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
解决laravel id非自增 模型取回为0 的问题
Oct 11 PHP
浅谈laravel框架与thinkPHP框架的区别
Oct 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边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python中异常报错处理方法汇总
2016/11/20 Python
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
python SOCKET编程基础入门
2021/02/27 Python
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
美国宠物商店:Wag.com
2016/10/25 全球购物
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
2015年大学生实习评语
2015/03/25 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
python缺失值的解决方法总结
2021/06/09 Python