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 相关文章推荐
解决phpmyadmin 乱码,支持gb2312和utf-8
Nov 20 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
PHP eval函数使用介绍
Dec 08 PHP
PHP中使用smarty生成静态文件的例子
Apr 24 PHP
浅析PHP微信支付通知的处理方式
May 25 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
ThinkPHP 表单自动验证运用示例
Oct 13 PHP
PHP实现服务器状态监控的方法
Dec 09 PHP
php计算2个日期的差值函数分享
Feb 02 PHP
thinkPHP5.0框架命名空间详解
Mar 18 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 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对图像的各种处理函数代码小结
2013/07/08 PHP
php中{}大括号是什么意思
2013/12/01 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
Javascript中With语句用法实例
2015/05/14 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
BootStrap按钮标签及基本样式
2016/11/23 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
Python中的random()方法的使用介绍
2015/05/15 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
物业总经理岗位职责
2014/02/28 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
老公保证书
2015/01/17 职场文书
vue中div禁止点击事件的实现
2022/04/02 Vue.js