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 相关文章推荐
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
php设计模式 Command(命令模式)
Jun 26 PHP
PHP抽象类 介绍
Jun 13 PHP
php处理文件的小例子(解压缩,删除目录)
Feb 03 PHP
PHP实现生成透明背景的PNG缩略图函数分享
Jul 08 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
PHP实现HTTP断点续传的方法
Jun 17 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
PHP实现导出带样式的Excel
Aug 28 PHP
php curl 模拟登录并获取数据实例详解
Dec 22 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 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重定向的三种方法分享
2012/02/22 PHP
PHP中的类型约束介绍
2015/05/11 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
PHP编写简单的App接口
2016/08/28 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
28个JS验证函数收集
2010/03/02 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
2019/06/18 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
python梯度下降法的简单示例
2018/08/31 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Django 反向生成url实例详解
2019/07/30 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
中专毕业生的自荐书
2014/07/01 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
2014年施工员工作总结
2014/11/18 职场文书
平安家庭事迹材料
2014/12/20 职场文书
护理自荐信
2019/05/14 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers