PHP文件操作实例总结【文件上传、下载、分页】


Posted in PHP onDecember 08, 2018

本文实例讲述了PHP文件操作。分享给大家供大家参考,具体如下:

1、文件上传

上传域: input type="file"

普通文本框(text、password、textarea、radio、checkbox等):通过字节流的形式将数据提交到服务器

文件: 将文件以二进制编码的形式提交过去,实现起来非常简单,只需要在form标签中增加 enctype="multipart/form-data"

<!-- 例如 -->
<form action="" method="post" enctype="multipart/form-data" >
  <input type="file" name="">
</form>

客户端提交文件之后服务器端接受用 $_FILES 接收

PHP文件操作实例总结【文件上传、下载、分页】

所谓文件上传就是将上图的临时文件移动到指定的目的地

使用函数 move_uploaded_file( file,newpath) 返回bool值

1.1 文件上传案例

// 例如
move_uploaded_file($_FILES['myfile']['tmp_name'], 'd:/upload/');

1.2 防止上传文件过大

知识

1GB == 1024MB
1MB == 1024KB
1KB == 1024Byte

$max_size = 3*1024*1024; // 约束为3M
if($_FILES['myfile']['size'] > $max_size){
  echo '上传图片大于3M';
  exit;
}
// 上传
if(move_uploaded_file($_FILES['myfile']['tmp_name'], $path)){
  echo '上传成功';
} else {
  echo '上传失败';
}

注意 php.ini 文件可以修改上传文件限制: 是否允许上传、上传的临时目录、文件最大限制、一次上传最大数量

1.3 防止文件被覆盖

1、我们在服务器端进行验证,在移动到目的地的时候,生成新的文件名时,使用随机数命名,可以避免文件名重复
2、按日期保存文件夹

1.4 控制上传的文件类型

一般需求是:.jpg .png .gif 格式的图片

防止修改文件后缀然后上传,可以借助php的扩展 Finfo,更加精确的获得文件的类型

// 为了防止用户修改文件后缀,使用php的一个扩展 Finfo 实现
# 1、开启php.ini 中php扩展
extension=php_fileinfo.dll
# 2、使用扩展类获取上传文件真实类型
$finfo = new Finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->file($_FILES['myfile']['tmp_name']);

自己封装的上传文件类

/*
 * 说明:文件上传类
 * 作者:sgw
 * 时间:2018-7-31
 */
class Upload
{
  //成员属性
  private $_maxsize    = 2*1024*1024;  //上传的文件最大范围2M
  private $_upload_path  = 'upload/'; //上传的文件保存路径
  private $_prefix     = 'odshen_';       //文件名的前缀
  private $allow_type   = array('.jpg','.png','.gif','.jpeg');  //允许上传的文件类型
  private $allow_mime_type = array('image/jpeg','image/png','image/gif','image/jpg');
  /**
   * set 设置私有的属性
   * @param [str] $p [属性名]
   * @param [mix] $v [给属性赋的值]
   */
  public function __set($p,$v)
  {
    if(property_exists($this,$p)){
      $this -> $p = $v;
    }
  }
  /**
   * get 获取私有属性
   * @param [str] $p [属性名]
   */
  public function __get($p)
  {
    if(property_exists($this,$p)){
      return $this -> $p;
    }
  }
  /**
   * 上传文件方法
   * @param [mix] $file [上传的文件]
   */
  public function doUpload($file)
  {
    //判断用户上传的文件大小
    $max_size = $this->_maxsize;  //约束最大为2M
    if($file['size'] > $max_size){
      echo '上传文件过大,重新上传';
      exit;
    }
    #防止上传的文件被覆盖
    $prefix = $this->_prefix;
    // 文件名唯一
    $filename = uniqid($prefix,true);
    //文件的后缀,从上传的文件名称中截取最后一个点后面的内容 strrchr
    $ext = strrchr($file['name'],'.');
    //分目录保存上传的文件,按照日期格式保存
    $sub_path = $this->_upload_path.date('Ymd').'/';    // upload/20180731/
    # 如果当前目录不存在,需要先创建 ,绝对路径
    $now_path = __DIR__.'/';
    $now_path = str_replace('\\','/',$now_path.$sub_path);
    if(!is_dir($now_path)){
      mkdir($now_path,0777,true);
    }
    # 限制用户上传的文件类型
    if(!in_array($ext,$this->allow_type)){
      echo '文件类型不支持';
      exit;
    }
    # 防止用户修改文件的后缀,借助php的一个扩展Finfo实现,精确获得每个文件在网络中的类型
    $finfo = new Finfo(FILEINFO_MIME_TYPE);
    $mime_type = $finfo -> file($file['tmp_name']);
    if(!in_array($mime_type,$this->allow_mime_type)){
      echo '文件类型不支持';
      exit;
    }
    //参数1:待移动的文件(临时文件)
    //参数2:目的地
    //返回结果布尔类型
    if(move_uploaded_file($file['tmp_name'],$now_path.$filename.$ext)){
      //上传成功将上传的文件地址返回,便于在其他地方使用该图片,就需要能够找到该图片
      return $sub_path . $filename.$ext;
    }else{
      //echo '上传失败';
      return false;
    }
  }
}

2、文件下载

文件大的借助第三方软件下载 ,例如百度云盘,迅雷;如果文件小,直接使用php进行下载

以下方法即可

//先接收地址栏中传递的文件名,也就是下载的是哪一个文件
$filename = $_GET['filename'];
if($filename==''){
  echo '文件未找到,下载失败';
  exit;
}
//拼接好文件的路径
$full_name = 'img/'.$filename;
//图片在windows系统下面gbk编码,php文件是utf-8编码
//通常需要先将php文件的编码修改为gbk
$full_name = iconv('utf-8','gbk',$full_name);
$filesize = filesize($full_name);
# 【主要】开始下载,通过header头信息告诉浏览器我向你回应的是文件资源
//返回的文件
header("Content-type: application/octet-stream");
//按照字节大小返回
header("Accept-Ranges: bytes");
//显示文件大小
header("Content-Length: $filesize");
//这里客户端的弹出对话框,对应的文件名
header("Content-Disposition: attachment; filename=".$filename);
//开始读取文件资源并回应给浏览器
$fp = fopen($full_name,'r');
while(!feof($fp)){
  $data = fread($fp,1024);
  echo $data;
}
fclose($fp);

3、分页类

结合 bootstrap

/*
 * 分页显示数据
 */
class Page
{
  private $_total;  //总的记录数
  private $_pagesize;  //每页显示的记录数
  private $_pagenow; //当前页码数
  private $_url;   //点击超链接时跳转的url地址
  /**
   * set 设置私有的属性
   * @param [str] $p [属性名]
   * @param [mix] $v [给属性赋的值]
   */
  public function __set($p,$v)
  {
    if(property_exists($this,$p)){
      $this -> $p = $v;
    }
  }
  /**
   * get 获取私有属性
   * @param [str] $p [属性名]
   */
  public function __get($p)
  {
    if(property_exists($this,$p)){
      return $this -> $p;
    }
  }
  //动态创建分页导航条
  public function create()
  {
    //定义首页按钮
    //当前页高亮显示
    $first_active = $this->_pagenow == 1?'active':'';
    $url = $this -> _url.'?page=';
    $first = 1;
    $PAGE = <<<HTML
      <ul class="pagination">
        <li class="$first_active"><a href="$url$first" rel="external nofollow" >首页</a></li>
HTML;
    //创建中间的分页导航按钮
    //先计算目前有多少页 == 总的数据 / 每页显示的数据
    $page_count = ceil($this -> _total / $this ->_pagesize);
    for($i=$this->_pagenow-3; $i<=$this->_pagenow+3; $i++){
      $active = $this->_pagenow == $i?'active':'';
      if($i <= 1 || $i>= $page_count){
        continue;  //跳出本次循环
      }
      $PAGE .= <<<HTML
      <li class="$active"><a href="$url$i" rel="external nofollow" >$i</a></li>
HTML;
    }
    //定义尾页按钮
    $last_active = $this->_pagenow == $page_count?'active':'';
    $PAGE .= <<<HTML
      <li class="$last_active"><a href="$url$page_count" rel="external nofollow" >尾页</a></li>
    </ul>
HTML;
    //将创建的分页导航条返回
    return $PAGE;
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 PHP
PHP实现根据时间戳获取周几的方法
Feb 26 PHP
PHP类的特性实例分析
Sep 28 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
Oct 21 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
Oct 17 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 PHP
Jsonp劫持学习
Apr 01 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 #PHP
Laravel框架定时任务2种实现方式示例
Dec 08 #PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 #PHP
thinkPHP框架实现的简单计算器示例
Dec 07 #PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 #PHP
laravel5使用freetds连接sql server的方法
Dec 07 #PHP
php多进程模拟并发事务产生的问题小结
Dec 07 #PHP
You might like
捕获关闭窗口的脚本
2009/01/10 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
js代码实现轮播图
2020/05/04 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
python冒泡排序算法的实现代码
2013/11/21 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
速记Python布尔值
2017/11/09 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
python实现桌面托盘气泡提示
2019/07/29 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
详解python算法常用技巧与内置库
2020/10/17 Python
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
18岁生日感言
2014/01/12 职场文书
行政人事岗位职责
2014/03/17 职场文书
《海底世界》教学反思
2014/04/16 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
2014国庆节标语口号
2014/09/19 职场文书
骨干教师申报材料
2014/12/17 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
背起爸爸上学观后感
2015/06/08 职场文书