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 相关文章推荐
提问的智慧
Oct 09 PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
May 18 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
Views rows style模板重写代码
May 16 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
Apr 21 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
深入理解PHP中的count函数
May 31 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 PHP
PHP实现的回溯算法示例
Aug 15 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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
用php来检测proxy
2006/10/09 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
javascript显示动态时间的方法汇总
2018/07/06 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
Python实现程序的单一实例用法分析
2015/06/03 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
手写一个python迭代器过程详解
2019/08/27 Python
django自定义模板标签过程解析
2019/12/14 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
市场营销战略计划书
2014/05/06 职场文书
医院节能减排方案
2014/06/13 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
百年孤独读书笔记
2015/06/29 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
世界十大狙击步枪排行榜
2022/03/20 杂记
python垃圾回收机制原理分析
2022/04/13 Python
python运行脚本文件的三种方法实例
2022/06/25 Python