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 相关文章推荐
php 小乘法表实现代码
Jul 16 PHP
用php实现的获取网页中的图片并保存到本地的代码
Jan 05 PHP
php获取url字符串截取路径的文件名和扩展名的函数
Jan 22 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
laravel中的错误与日志用法详解
Jul 26 PHP
php mysql操作mysql_connect连接数据库实例详解
Dec 26 PHP
PHP全功能无变形图片裁剪操作类与用法示例
Jan 10 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
Aug 03 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 PHP
实例分析PHP将字符串转换成数字的方法
Jan 27 PHP
PHP中用Trait封装单例模式的实现
Dec 18 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动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
Gird事件机制初级读本
2007/03/10 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
详解React 元素渲染
2020/07/07 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
简单谈谈python基本数据类型
2018/09/26 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
企业厂长岗位职责
2013/12/17 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
2014年班级工作总结
2014/11/14 职场文书
学生个人评语大全
2015/01/04 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
幼儿园小班班务总结
2015/08/03 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python