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出现Cannot modify header information问题的解决方法大全
Apr 09 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
php jquery 实现新闻标签分类与无刷新分页
Dec 18 PHP
PHP的autoload机制的实现解析
Sep 15 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
Jun 10 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
php实现RSA加密类实例
Mar 26 PHP
highchart数据源纵轴json内的值必须是int(详解)
Feb 20 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 PHP
php探针使用原理和技巧讲解
Sep 17 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获取网页内容方法总结
2008/12/04 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
vue-cli3.0 特性解读
2018/04/22 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
数学教研活动总结
2014/07/02 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
五好家庭事迹材料
2014/12/20 职场文书
乐山大佛导游词
2015/02/02 职场文书
导游词之西安大清真寺
2019/12/17 职场文书