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基础知识:类与对象(1)
Dec 13 PHP
PHP 5.0对象模型深度探索之对象复制
Mar 27 PHP
简单PHP上传图片、删除图片实现代码
May 12 PHP
深入密码加salt原理的分析
Jun 06 PHP
php生成短网址示例
May 05 PHP
php随机获取金山词霸每日一句的方法
Jul 09 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
php 无限级分类 获取顶级分类ID
Mar 13 PHP
全面了解PHP中的全局变量
Jun 17 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
PHP7原生MySQL数据库操作实现代码
Jul 03 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
PHP的PSR规范中文版
2013/09/28 PHP
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
Python入门教程之if语句的用法
2015/05/14 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
python获取array中指定元素的示例
2019/11/26 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
建筑文秘专业个人求职信范文
2013/12/28 职场文书
技术经济专业求职信
2014/09/03 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
颐和园导游词
2015/01/30 职场文书
辞职申请书范本
2019/05/20 职场文书