• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
霓小沫儿 显示全部楼层 发表于 2021-10-26 13:37:46 |阅读模式 打印 上一主题 下一主题
本文实例报告了PHP文件操纵。分享给各人供各人参考,具体如下:
1、文件上传
  1. 上传域: [code]input type="file"
复制代码
平凡文本框(text、password、textarea、radio、checkbox等):通过字节流的情势将数据提交到服务器文件: 将文件以二进制编码的情势提交过去,实现起来非常简单,只需要在form标签中增长
  1. enctype="multipart/form-data"
复制代码
[/code]
  1. <!-- 例如 -->
  2. <form action="" method="post" enctype="multipart/form-data" >
  3.   <input type="file" name="">
  4. </form>
复制代码
客户端提交文件之后服务器端接受用 $_FILES 接收

所谓文件上传就是将上图的临时文件移动到指定的目的地
使用函数
  1. move_uploaded_file( file,newpath)
复制代码
返回bool值
1.1 文件上传案例
  1. // 例如
  2. move_uploaded_file($_FILES['myfile']['tmp_name'], 'd:/upload/');
复制代码
1.2 防止上传文件过大

知识
1GB == 1024MB
1MB == 1024KB
1KB == 1024Byte
  1. $max_size = 3*1024*1024; // 约束为3M
  2. if($_FILES['myfile']['size'] > $max_size){
  3.   echo '上传图片大于3M';
  4.   exit;
  5. }
  6. // 上传
  7. if(move_uploaded_file($_FILES['myfile']['tmp_name'], $path)){
  8.   echo '上传成功';
  9. } else {
  10.   echo '上传失败';
  11. }
复制代码
注意 php.ini 文件可以修改上传文件限制: 是否允许上传、上传的临时目次、文件最大限制、一次上传最大数量
1.3 防止文件被覆盖
  1. 1、我们在服务器端进行验证,在移动到目的地的时候,生成新的文件名时,使用随机数命名,可以避免文件名重复
  2. 2、按日期保存文件夹
复制代码
1.4 控制上传的文件类型

一般需求是:.jpg .png .gif 格式的图片
防止修改文件后缀然后上传,可以借助php的扩展 Finfo,更加准确的得到文件的类型
  1. // 为了防止用户修改文件后缀,使用php的一个扩展 Finfo 实现
  2. # 1、开启php.ini 中php扩展
  3. extension=php_fileinfo.dll
  4. # 2、使用扩展类获取上传文件真实类型
  5. $finfo = new Finfo(FILEINFO_MIME_TYPE);
  6. $mime_type = $finfo->file($_FILES['myfile']['tmp_name']);
复制代码
自己封装的上传文件类
  1. /*
  2. * 说明:文件上传类
  3. * 作者:sgw
  4. * 时间:2018-7-31
  5. */
  6. class Upload
  7. {
  8.   //成员属性
  9.   private $_maxsize    = 2*1024*1024;  //上传的文件最大范围2M
  10.   private $_upload_path  = 'upload/'; //上传的文件保存路径
  11.   private $_prefix     = 'odshen_';       //文件名的前缀
  12.   private $allow_type   = array('.jpg','.png','.gif','.jpeg');  //允许上传的文件类型
  13.   private $allow_mime_type = array('image/jpeg','image/png','image/gif','image/jpg');
  14.   /**
  15.    * set 设置私有的属性
  16.    * @param [str] $p [属性名]
  17.    * @param [mix] $v [给属性赋的值]
  18.    */
  19.   public function __set($p,$v)
  20.   {
  21.     if(property_exists($this,$p)){
  22.       $this -> $p = $v;
  23.     }
  24.   }
  25.   /**
  26.    * get 获取私有属性
  27.    * @param [str] $p [属性名]
  28.    */
  29.   public function __get($p)
  30.   {
  31.     if(property_exists($this,$p)){
  32.       return $this -> $p;
  33.     }
  34.   }
  35.   /**
  36.    * 上传文件方法
  37.    * @param [mix] $file [上传的文件]
  38.    */
  39.   public function doUpload($file)
  40.   {
  41.     //判断用户上传的文件大小
  42.     $max_size = $this->_maxsize;  //约束最大为2M
  43.     if($file['size'] > $max_size){
  44.       echo '上传文件过大,重新上传';
  45.       exit;
  46.     }
  47.     #防止上传的文件被覆盖
  48.     $prefix = $this->_prefix;
  49.     // 文件名唯一
  50.     $filename = uniqid($prefix,true);
  51.     //文件的后缀,从上传的文件名称中截取最后一个点后面的内容 strrchr
  52.     $ext = strrchr($file['name'],'.');
  53.     //分目录保存上传的文件,按照日期格式保存
  54.     $sub_path = $this->_upload_path.date('Ymd').'/';    // upload/20180731/
  55.     # 如果当前目录不存在,需要先创建 ,绝对路径
  56.     $now_path = __DIR__.'/';
  57.     $now_path = str_replace('\\','/',$now_path.$sub_path);
  58.     if(!is_dir($now_path)){
  59.       mkdir($now_path,0777,true);
  60.     }
  61.     # 限制用户上传的文件类型
  62.     if(!in_array($ext,$this->allow_type)){
  63.       echo '文件类型不支持';
  64.       exit;
  65.     }
  66.     # 防止用户修改文件的后缀,借助php的一个扩展Finfo实现,精确获得每个文件在网络中的类型
  67.     $finfo = new Finfo(FILEINFO_MIME_TYPE);
  68.     $mime_type = $finfo -> file($file['tmp_name']);
  69.     if(!in_array($mime_type,$this->allow_mime_type)){
  70.       echo '文件类型不支持';
  71.       exit;
  72.     }
  73.     //参数1:待移动的文件(临时文件)
  74.     //参数2:目的地
  75.     //返回结果布尔类型
  76.     if(move_uploaded_file($file['tmp_name'],$now_path.$filename.$ext)){
  77.       //上传成功将上传的文件地址返回,便于在其他地方使用该图片,就需要能够找到该图片
  78.       return $sub_path . $filename.$ext;
  79.     }else{
  80.       //echo '上传失败';
  81.       return false;
  82.     }
  83.   }
  84. }
复制代码
2、文件下载

文件大的借助第三方软件下载 ,比方百度云盘,迅雷;假如文件小,直接使用php进行下载
以下方法即可
  1. //先接收地址栏中传递的文件名,也就是下载的是哪一个文件
  2. $filename = $_GET['filename'];
  3. if($filename==''){
  4.   echo '文件未找到,下载失败';
  5.   exit;
  6. }
  7. //拼接好文件的路径
  8. $full_name = 'img/'.$filename;
  9. //图片在windows系统下面gbk编码,php文件是utf-8编码
  10. //通常需要先将php文件的编码修改为gbk
  11. $full_name = iconv('utf-8','gbk',$full_name);
  12. $filesize = filesize($full_name);
  13. # 【主要】开始下载,通过header头信息告诉浏览器我向你回应的是文件资源
  14. //返回的文件
  15. header("Content-type: application/octet-stream");
  16. //按照字节大小返回
  17. header("Accept-Ranges: bytes");
  18. //显示文件大小
  19. header("Content-Length: $filesize");
  20. //这里客户端的弹出对话框,对应的文件名
  21. header("Content-Disposition: attachment; filename=".$filename);
  22. //开始读取文件资源并回应给浏览器
  23. $fp = fopen($full_name,'r');
  24. while(!feof($fp)){
  25.   $data = fread($fp,1024);
  26.   echo $data;
  27. }
  28. fclose($fp);
复制代码
3、分页类

联合 bootstrap
  1. /*
  2. * 分页显示数据
  3. */
  4. class Page
  5. {
  6.   private $_total;  //总的记录数
  7.   private $_pagesize;  //每页显示的记录数
  8.   private $_pagenow; //当前页码数
  9.   private $_url;   //点击超链接时跳转的url地址
  10.   /**
  11.    * set 设置私有的属性
  12.    * @param [str] $p [属性名]
  13.    * @param [mix] $v [给属性赋的值]
  14.    */
  15.   public function __set($p,$v)
  16.   {
  17.     if(property_exists($this,$p)){
  18.       $this -> $p = $v;
  19.     }
  20.   }
  21.   /**
  22.    * get 获取私有属性
  23.    * @param [str] $p [属性名]
  24.    */
  25.   public function __get($p)
  26.   {
  27.     if(property_exists($this,$p)){
  28.       return $this -> $p;
  29.     }
  30.   }
  31.   //动态创建分页导航条
  32.   public function create()
  33.   {
  34.     //定义首页按钮
  35.     //当前页高亮显示
  36.     $first_active = $this->_pagenow == 1?'active':'';
  37.     $url = $this -> _url.'?page=';
  38.     $first = 1;
  39.     $PAGE = <<<HTML
  40.       <ul class="pagination">
  41.         <li class="$first_active"><a href="$url$first" rel="external nofollow" >首页</a></li>
  42. HTML;
  43.     //创建中间的分页导航按钮
  44.     //先计算目前有多少页 == 总的数据 / 每页显示的数据
  45.     $page_count = ceil($this -> _total / $this ->_pagesize);
  46.     for($i=$this->_pagenow-3; $i<=$this->_pagenow+3; $i++){
  47.       $active = $this->_pagenow == $i?'active':'';
  48.       if($i <= 1 || $i>= $page_count){
  49.         continue;  //跳出本次循环
  50.       }
  51.       $PAGE .= <<<HTML
  52.       <li class="$active"><a href="$url$i" rel="external nofollow" >$i</a></li>
  53. HTML;
  54.     }
  55.     //定义尾页按钮
  56.     $last_active = $this->_pagenow == $page_count?'active':'';
  57.     $PAGE .= <<<HTML
  58.       <li class="$last_active"><a href="$url$page_count" rel="external nofollow" >尾页</a></li>
  59.     </ul>
  60. HTML;
  61.     //将创建的分页导航条返回
  62.     return $PAGE;
  63.   }
  64. }
复制代码
更多关于PHP相关内容感兴趣的读者可检察本站专题:《php文件操纵总结》、《PHP目次操纵本领汇总》、《PHP常用遍历算法与本领总结》、《PHP数据布局与算法教程》、《php步伐计划算法总结》及《PHP网络编程本领总结》
希望本文所述对各人PHP步伐计划有所资助。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作