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 相关文章推荐
php 取得瑞年与平年的天数的代码
Aug 10 PHP
php下把数组保存为文件格式的实例应用
Feb 08 PHP
PHP使用数组实现队列
Feb 05 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
php中JSON的使用与转换
Jan 14 PHP
php实现批量修改文件名称的方法
Jul 23 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP中的empty、isset、isnull的区别与使用实例
Mar 22 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
May 27 PHP
在Laravel中实现使用AJAX动态刷新部分页面
Oct 15 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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和MySql中计算时间差的方法
2011/04/22 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
Codeigniter校验ip地址的方法
2015/03/21 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
php7 新增功能实例总结
2020/05/25 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
微信小程序 Storage API实例详解
2016/10/02 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python-基础-入门 简介
2014/08/09 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
python中pivot()函数基础知识点
2021/01/03 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
公关关系专员的自我评价分享
2013/11/20 职场文书
大学生个人求职信
2014/06/02 职场文书
导游词之天津盘山
2019/11/01 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
python爬取豆瓣电影TOP250数据
2021/05/23 Python
nginx共享内存的机制详解
2022/03/21 Servers