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打造属于自己的MVC框架
Mar 07 PHP
PHP实现的封装验证码类详解
Jun 18 PHP
php selectradio和checkbox默认选择的实现方法详解
Jun 29 PHP
使用php记录用户通过搜索引擎进网站的关键词
Feb 13 PHP
destoon调用自定义模板及样式的公告栏
Jun 21 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
php浏览历史记录的方法
Mar 10 PHP
php实现文章置顶功能的方法
Oct 20 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 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
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
js命名空间写法示例
2015/12/18 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
使用vue构建多页面应用的示例
2020/10/22 Javascript
python实现简单ftp客户端的方法
2015/06/28 Python
Python基于百度云文字识别API
2018/12/13 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
Oracle性能调优原则
2012/05/03 面试题
Linux上比较文件的命令都有哪些
2013/09/28 面试题
商务主管岗位职责
2013/12/08 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
项目申请汇报材料
2014/08/16 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
python实现双向链表原理
2022/05/25 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python