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 csv操作类代码
Dec 14 PHP
php定时删除文件夹下文件(清理缓存文件)
Jan 23 PHP
解析PHP中常见的mongodb查询操作
Jun 20 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
php实现图片局部打马赛克的方法
Feb 11 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
Apr 09 PHP
详解laravel passport OAuth2.0的4种模式
Nov 04 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 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字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
PHP Array交叉表实现代码
2010/08/05 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
一篇不错的Python入门教程
2007/02/08 Python
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
python+django快速实现文件上传
2016/10/24 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
python实现密码强度校验
2020/03/18 Python
python ETL工具 pyetl
2020/06/07 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
nohup的用法
2014/08/10 面试题
幼儿园元旦活动感言
2014/03/02 职场文书
师德建设实施方案
2014/03/21 职场文书
计算机实训报告范文
2014/11/05 职场文书
钢琴师观后感
2015/06/12 职场文书
干部理论学习心得体会
2016/01/21 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
一文搞懂Redis中String数据类型
2022/04/03 Redis