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&amp;MYSQL服务器配置说明
Oct 09 PHP
php实现mysql数据库备份类
Mar 20 PHP
php 更新数据库中断的解决方法
Jun 05 PHP
php实现window平台的checkdnsrr函数
May 27 PHP
PHP实现简单数字分页效果
Jul 26 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 PHP
php实现URL加密解密的方法
Nov 17 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
PHP中strval()函数实例用法
Jun 07 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中读写文件实现代码
2011/10/20 PHP
将php数组输出html表格的方法
2014/02/24 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
php编程每天必学之表单验证
2016/03/01 PHP
php的扩展写法总结
2019/05/14 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
海量经典的jQuery插件集合
2010/01/12 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
Python判断操作系统类型代码分享
2014/11/22 Python
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
python文件选择对话框的操作方法
2019/06/27 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
面向对象编程是如何提高软件开发水平的
2014/05/06 面试题
用Python写一个for循环的例子
2016/07/19 面试题
工作个人的自我评价
2014/01/14 职场文书
企业标语口号
2014/06/10 职场文书
重阳节活动总结
2014/08/27 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
活动经费申请报告
2015/05/15 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript