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 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
PHP Socket 编程
Apr 09 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
php常见的魔术方法详解
Dec 25 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
php版微信公众平台之微信网页登陆授权示例
Sep 23 PHP
ThinkPHP5框架缓存查询操作分析
May 30 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
php实现登录页面的简单实例
Sep 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
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
python连接池实现示例程序
2013/11/26 Python
Python入门篇之面向对象
2014/10/20 Python
Python中return语句用法实例分析
2015/08/04 Python
Python 基础知识之字符串处理
2017/01/06 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
团员的自我评价
2013/12/01 职场文书
小学作文评语大全
2014/04/21 职场文书
先进党支部申报材料
2014/12/24 职场文书
春风化雨观后感
2015/06/11 职场文书
政审证明材料
2015/06/19 职场文书
Golang jwt身份认证
2022/04/20 Golang