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 相关文章推荐
《APMServ 5.1.2》使用图解
Oct 23 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 PHP
PHP中单引号与双引号的区别分析
Aug 19 PHP
PHP 的比较运算与逻辑运算详解
May 12 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
PHP批量删除jQuery操作
Jul 23 PHP
浅析PHP开发规范
Feb 05 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 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
自己前几天写的无限分类类
2007/02/14 PHP
微信红包随机生成算法php版
2016/07/21 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
JavaScript多线程的实现方法
2007/05/08 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
python实现多层感知器
2019/01/18 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
一行python实现树形结构的方法
2019/08/09 Python
python支付宝支付示例详解
2019/08/22 Python
小结Python的反射机制
2020/09/28 Python
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
为什么要有struct关键字
2012/05/08 面试题
运动会入场解说词300字
2014/01/25 职场文书
小学清明节活动总结
2014/07/04 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
升学宴答谢词
2015/01/05 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
MYSQL 运算符总结
2021/11/11 MySQL
python使用torch随机初始化参数
2022/03/22 Python
Java的Object类的九种方法
2022/04/13 Java/Android
基于Python实现西西成语接龙小助手
2022/08/05 Golang