PHP文件上传操作实例详解


Posted in PHP onSeptember 27, 2016

本文实例分析了PHP文件上传操作。分享给大家供大家参考,具体如下:

文件上传

发生在浏览器向服务器发出的请求中。

文件,对于浏览器来讲,就是表单中的一个特殊类型的数据而已。

浏览器表单中的数据,两种类型:

字符串类型(字节流编码)

文件类型(二进制编码),文件是表单数据中一部分

服务器角度:

在接受浏览器请求时,处理好表单内的数据。根据数据类型不同使用不同处理方法:

字符串类型,存储在$_POST变量中(内存)

文件型数据,存储在上传临时目录中

表单提交时,浏览器会默认的行为:

表单内的的内容都是字符串类型,即使添加了文件域,需要在form上增加属性,告知浏览器上传的不止有字符串类型数据。enctype="multipart/form-data"

<body>
  <form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    </br>
    <input type="submit" value="submit">
  </form>
</body>

php服务器在接收到文件类型的表单数据后,将文件存储于临时目录(属于临时文件,脚本周期内有效)

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
;upload_tmp_dir =

将临时文件持久化存储

move_uploaded_file(src_url,goa_url)

$_FILES,存储了上传文件的信息包括临时地址

PHP文件上传操作实例详解

错误类型:

0-1-2-3-4-6-7

0表示没有错误

1表示文件大于php的设置

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M

2表示文件大于表单设置max_file_size

<input type='hidden' name='MAX_FILE_SIZE' value='1024'>

3表示文件上传不完整

4表示没有上传文件

5表示逻辑上上传了0字节的文件(空文件)

6表示没有找到临时上传目录(权限不足)

7表示文件写入失败(磁盘空间、权限)

php允许的最大上传文件数量

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

post存在最大值限制

一旦超过,php就不能正常处理post与file值可能为空值

; Maximum size of POST data that PHP will accept.
; http://php.net/post-max-size
post_max_size = 8M

类型检测中

后缀名与mime都是浏览器提供的,需要php的扩展fileinfo完成对文件信息的检查(函数过程与面向对象)

;extension=php_fileinfo.dll

$finfo = new Finfo(FILEINFO_MIME_TYPE);
$mine_type = $finfo->file($file['tmp_name']);

分子目录存储上传文件

原则:业务逻辑、文件数量、时间

创建目录 mkdir()

检查目录 is_dir()

<?php
upload($_FILES['file']);
function upload($file){
  if($file['error']!=0){
    return false;
  }
  //3M
  $max_size = 3145728;
  if($max_size<$file['size']){
    return false;
  }
  //设置一个后缀名与mime的映射关系
  $type_map = array(
    '.jpeg'=>array('image/jpeg','image/pjpeg'),
    '.jpg'=>array('image/jpeg','image/pjpeg'),
    '.png'=>array('image/png','image/x-png'),
    '.gif'=>array('image/gif')
  );
  //后缀
  $allow_ext_list = array('.jpeg','.png','.jpg');
  $ext = strtolower(strrchr($file['name'],'.'));
  if(!in_array($ext,$allow_ext_list)){
    echo '不支持该图片格式';
    return false;
  }
  //MIME
  $allow_mime_list = array();
  foreach($allow_ext_list as $val){
    $allow_mime_list = array_merge($allow_mime_list,$type_map[$val]);
  }
  //浏览器提供信息坚持
  $allow_mime_list = array_unique($allow_mime_list);
  if(!in_array($file['type'],$allow_mime_list)){
    echo '不支持该图片格式';
    return false;
  }
  //php自身检查
  $file_mime = new Finfo(FILEINFO_MIME_TYPE);
  $mime = $file_mime->file($file['tmp_name']);
  if(!in_array($mime,$allow_mime_list)){
    echo '不支持该图片格式';
    return false;
  }
  //目录存储
  $up_loadpath = './';
  $sub_dir = date('Ymdh');
  if(!is_dir($up_loadpath.$sub_dir)){
    mkdir($up_loadpath.$sub_dir);
  }
  $prefix = 'bee_';
  $name = uniqid($prefix,true).$ext;
  if(move_uploaded_file($file['tmp_name'],$up_loadpath.$sub_dir.$name)){
    echo '上传成功';
    return $name;
  }else{
    echo '上传失败';
    return false;
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP4实际应用经验篇(6)
Oct 09 PHP
模仿OSO的论坛(四)
Oct 09 PHP
一段防盗连的PHP代码
Dec 06 PHP
PHP入门学习笔记之一
Oct 12 PHP
php中将网址转换为超链接的函数
Sep 02 PHP
php堆排序(heapsort)练习
Nov 13 PHP
php jquery 多文件上传简单实例
Dec 23 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
PHP中is_dir()函数使用指南
May 08 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
PHP目录操作实例总结
Sep 27 #PHP
PHP文件操作实例总结
Sep 27 #PHP
PHP命名空间namespace用法实例分析
Sep 27 #PHP
PHP7标量类型declare用法实例分析
Sep 26 #PHP
PHP7新增运算符用法实例分析
Sep 26 #PHP
PHP7匿名类用法分析
Sep 26 #PHP
PHP7常量数组用法分析
Sep 26 #PHP
You might like
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
PHP MemCached 高级缓存应用代码
2010/08/05 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
PHP中的session安全吗?
2016/01/22 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
浅析Ajax语法
2016/12/05 Javascript
详解vue axios二次封装
2018/07/22 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
粗略分析Python中的内存泄漏
2015/04/23 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
Python多分支if语句的使用
2020/09/03 Python
室内设计专业学生的自我评价分享
2013/11/27 职场文书
煤矿班组长岗位职责
2013/12/29 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
初中差生评语
2014/12/29 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书