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 相关文章推荐
PHP4与PHP5的时间格式问题
Feb 17 PHP
PHP Memcached应用实现代码
Feb 08 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
Oct 03 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
分享PHP header函数使用教程
Sep 05 PHP
PHP函数之日期时间函数date()使用详解
Sep 09 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
linux下实现定时执行php脚本
Feb 13 PHP
详解PHP swoole process的使用方法
Aug 26 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 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
5种PHP创建数组的实例代码分享
2014/01/17 PHP
php判断是否为json格式的方法
2014/03/04 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
yii数据库的查询方法
2015/12/28 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
javascript String 对象
2008/04/25 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
python 字符串常用函数详解
2019/09/11 Python
python+opencv实现车道线检测
2021/02/19 Python
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
《晚上的太阳》教学反思
2014/04/23 职场文书
大学学风建设方案
2014/05/04 职场文书
服务承诺书怎么写
2014/05/24 职场文书
店铺转让协议书
2014/12/02 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android
golang中字符串MD5生成方式总结
2021/07/04 Golang