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 相关文章推荐
PHP的可变变量名的使用方法分享
Feb 05 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
Jul 25 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
Dec 16 PHP
php查看当前Session的ID实例
Mar 16 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
Jan 17 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
laravel 获取某个查询的查询SQL语句方法
Oct 12 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 PHP
php与阿里云短信接口接入操作案例分析
May 27 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
77A一级收信机修理记
2021/03/02 无线电
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
Python去除列表中重复元素的方法
2015/03/20 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
python中os.remove()用法及注意事项
2021/01/31 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
十一个高级MySql面试题
2014/10/06 面试题
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
初中生学习的自我评价
2013/11/14 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
交通安全责任书范本
2014/07/24 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
教育见习报告范文
2014/11/03 职场文书
学生评语集锦
2015/01/04 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书