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 相关文章推荐
MYSQL环境变量设置方法
Jan 15 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
PHPwind整合最土系统用户同步登录实现方法
Dec 08 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
PHP中的use关键字概述
Jul 23 PHP
php判断文件夹是否存在不存在则创建
Apr 09 PHP
php使用正则验证中文
Apr 06 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
PHP日志LOG类定义与用法示例
Sep 06 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 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中echo,print_r与var_dump区别分析
2014/09/29 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
2017/03/25 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
用Python shell简化开发
2018/08/08 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Python求解排列中的逆序数个数实例
2020/05/03 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
工作骂脏话检讨书
2014/10/05 职场文书
未婚证明范本
2015/06/15 职场文书
入党后的感想
2015/08/10 职场文书
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle