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 相关文章推荐
centos 5.6 升级php到5.3的方法
May 14 PHP
PHP教程之PHP中shell脚本的使用方法分享
Feb 23 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
如何使用PHP批量去除文件UTF8 BOM信息
Aug 05 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
Jan 07 PHP
通过php动态传数据到highcharts
Apr 05 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
Thinkphp集成抖音SDK的实现方法
Apr 28 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
Jun 05 PHP
PHP反射基础知识回顾
Sep 10 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实现用户认证及管理完全源码
2007/03/11 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
php数组合并与拆分实例分析
2015/06/12 PHP
session 加入redis的实现代码
2016/07/15 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
JS 控制非法字符的输入代码
2009/12/04 Javascript
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
Python定时执行之Timer用法示例
2015/05/27 Python
Python实现建立SSH连接的方法
2015/06/03 Python
python后端接收前端回传的文件方法
2019/01/02 Python
Django的Modelforms用法简介
2019/07/27 Python
PHP统计代码行数的小代码
2019/09/19 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
linux面试题参考答案(7)
2014/07/24 面试题
优秀志愿者事迹材料
2014/02/03 职场文书
小学教师师德承诺书
2014/05/23 职场文书
旅游节目策划方案
2014/05/26 职场文书
2014年协会工作总结
2014/11/22 职场文书
审美与表现自我评价
2015/03/09 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
幼儿园六一主持词
2015/06/30 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers
JavaScript实现队列结构过程
2021/12/06 Javascript
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android