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_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
纯真IP数据库的应用 IP地址转化成十进制
Jun 14 PHP
php include加载文件两种方式效率比较
Aug 08 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
php调用c接口无错版介绍
Mar 11 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
Nov 21 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
Mar 11 PHP
laravel执行php artisan migrate报错的解决方法
Oct 09 PHP
phpStudy vscode 搭建debug调试的教程详解
Jul 28 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
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
JavaScript中的细节分析
2012/06/30 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python Logging 日志记录入门学习
2018/06/02 Python
python程序 创建多线程过程详解
2019/09/23 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
Python 读取位于包中的数据文件
2020/08/07 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
《月光启蒙》教学反思
2014/03/01 职场文书
英语故事演讲稿
2014/04/29 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
干部选拔任用方案
2014/05/26 职场文书
春秋淹城导游词
2015/02/11 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
小学教师见习总结
2015/06/23 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
TS 类型兼容教程示例详解
2022/09/23 Javascript