1. 1: <?php

  1. 2: /**

  1. 3: * [FileDown 公用文件下载方法]

  1. 4: * @param [type] $filePath [文件路径(绝对路径或相对路径)]

  1. 5: */

  1. 6: function FileDown($filePath)

  1. 7: {

  1. 8: //由于php中的文件函数默认只支持gb2312编码的中文,这里使用iconv()函数转码为GB2312编码

  1. 9: $filePath = iconv("UTF-8", "GB2312//IGNORE", $filePath);

  1. 10: 

  1. 11: //检测文件是否存在:

  1. 12: if(!file_exists($filePath)){

  1. 13: die("文件不存在!");

  1. 14: }

  1. 15: 

  1. 16: //打开文件:

  1. 17: $file = @fopen($filePath, "r");

  1. 18: 

  1. 19: // 获取文件大小

  1. 20: $fileSize = filesize($filePath);

  1. 21:

  1. 22: //获取文件名

  1. 23: $fileName =get_basename($filePath);

  1. 24: 

  1. 25: 

  1. 26: //添加响应头信息

  1. 27: header("Content-Type: application/octet-stream");//返回类型:二进制文件流

  1. 28: header("Accept-Ranges: bytes"); //告诉客户端以字节数组接受

  1. 29: header("Accept-Length: $fileSize"); //告诉客户端需要接受的文件大小

  1. 30: header("Content-Disposition: attachment; filename=".$fileName);//设置下载对话框中显示的文件名

  1. 31: 

  1. 32: //循环读取指定大小的文件数据返回给客户端

  1. 33: $buffer=1024;

  1. 34: $sendCount=0;

  1. 35: while (!feof($file)&&($fileSize-$sendCount>0)) {

  1. 36: $sendCount+=$buffer;

  1. 37: echo fread($file, $buffer);//每次读取1024字节的文件数据返回给客户端

  1. 38: }

  1. 39: 

  1. 40: // 关闭文件流

  1. 41: fclose($file);

  1. 42: }

  1. 43: 

  1. 44: //根据文件路径获取文件的扩展名

  1. 45: function get_extension($filePath)

  1. 46: {

  1. 47: return pathinfo($filePath, PATHINFO_EXTENSION);

  1. 48: }

  1. 49: 

  1. 50: //根据文件路径获取文件名

  1. 51: function get_basename($filePath)

  1. 52: {

  1. 53: //使用正则表达式将文件名之前的内容替换为"",返回结果

  1. 54: return preg_replace('/^.+[\\\\\\/]/', '', $filePath);

  1. 55: }

  1. 56: 

  1. 57: ?>

调用示例:

  1. 1: <?php

  1. 2: //添加引用

  1. 3: require_once("FileDownService.php");

  1. 4: 

  1. 5: //设置客户端页面编码

  1. 6: header("Content-Type:text/html; charset=utf-8");

  1. 7: 

  1. 8: //从Request中取出fiLeName参数

  1. 9: if(isset($_REQUEST["fileName"]))

  1. 10: {

  1. 11: //设置文件的绝路径

  1. 12: $filePath = $_SERVER["DOCUMENT_ROOT"]."/downfiles/".$_REQUEST["fileName"];

  1. 13: 

  1. 14: //调用文件下载方法进行下载

  1. 15: FileDown($filePath);

  1. 16: }

  1. 17: 

  1. 18: ?>

PHP基础文件下载类的简单封装的更多相关文章

  1. 关于Spring-JDBC测试类的简单封装

    关于Spring-JDBC测试类的简单封装 1.简单封装 /** * Created with IntelliJ IDEA. * * @Author: Suhai * @Date: 2022/04/0 ...

  2. web自动化框架—BasePage 类的简单封装

    优秀的框架都有属于自己的思想,在搭建web自动化测试框架时,我们通常都遵循 PO(Page Object)思想. 简单理解就是我们会把每个页面看成一个对象,一切皆对象,面向对象编码,这样会让我们更好的 ...

  3. 初学JDBC,JDBC工具类的简单封装

    //工具类不需要被继承 public final class JdbcUtils{ //封装数据库连接参数,便于后期更改参数值 private static String url="jdbc ...

  4. 【JAVA零基础入门系列】Day12 Java类的简单应用

    俗话说的好,实践出真知,所以除了理论知识掌握扎实以外,更重要的是要多加操练,这样才能掌握核心科技. 今天我们就用刚学会的类来实践一下,目标便是完成上一篇中的剁手任务. 我们的商品类已经准备好了,代码重 ...

  5. .net core 中简单封装Dapper.Extensions 并使用sqlsuger自动生成实体类

    引言 由公司需要使用dapper  同时支持多数据库 又需要支持实体类 又需要支持sql 还需要支持事务 所以采用了 dapper + dapperExtensions  并配套 生成实体类小工具的方 ...

  6. swift开发之--简单封装Alamofire请求类以及简单使用SnapKit

    以前在swift3的时候,写过类似的,那个时候还没有很成熟的网络请求类库,在这里,还是衷心感谢大神们的付出! 具体效果如下,先上图: 点击按钮的时候,请求数据,数据结构如下: { ; reason = ...

  7. FMDB简单封装和使用

    工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...

  8. 使用泛型简单封装NGUI的ScrollView实现滑动列表

    懒,是老毛病了,周末跑了半马,跑完也是一通累,好久没锻炼了..也是懒的,有时都懒的写博客..最近看到项目中各种滑动列表框,本着要懒出水平来的原则,决定花点时间简单处理下(暂时未做列表太多时的优化):1 ...

  9. Google图片加载库Glide的简单封装GlideUtils

    Google图片加载库Glide的简单封装GlideUtils 因为项目里用的Glide的地方比较多,所有简单的封装了以下,其实也没什么,就是写了个工具类,但是还是要把基础说下 Glide的Githu ...

随机推荐

  1. PHP Fatal error: Call to undefined function mb_substr()

    Lamp架构 PHP 5.3.29 #查看php是否有mbstring模块 php -m | grep mbstring yum install php-mbstring -y find / -nam ...

  2. 数据结构算法C语言实现(十四)--- 4.1&4.2串的类型定义、表示及实现

    一.简述 [暂无] 二.头文件 //4_2_part1.h /** author:zhaoyu */ //2016-6-10 //----串的定长顺序存储表示---- #include "h ...

  3. AspectJ获取方法注解的信息

    在使用Aspectj获取方法注解信息的时候,可以使用下面的代码片段: /** * Get value of annotated method parameter */ private <T ex ...

  4. HDU 5907 Find Q(简单字符串)

    传送门 Description Byteasar is addicted to the English letter 'q'. Now he comes across a string S consi ...

  5. [JavaEE]Java NIO原理图文分析及代码实现

    转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO ...

  6. python 基于windows环境的ftp功能

    描述: 1.基于备份服务器部署的py程序,将需要备份主机目录下的内容下载至备份服务器(服务端和远端都是windows server 2008) 2.py程序部署在windows服务器,后台运行,基于b ...

  7. 利用WSCF进行契约先行的Web Services开发

    http://www.cnblogs.com/goody9807/archive/2007/06/05/772107.html 什么是契约先行(Contract-First)? 如果说一个新的软件开发 ...

  8. MVVM

    MVVM 是 Model-View-ViewModel 的简写,MVVM 模式和 MVC 模式一样,主要目的是分离视图(View)和模型(Model) 接下来给大家分享一个总结的MVVM,来吧---- ...

  9. nginx查看安装了哪些模块

    查看安装了哪些模块命令: [root@RG-PowerCache-X xcache]# nginx/sbin/nginx -Vnginx version: nginx/1.2.3built by gc ...

  10. angularjs工具方法

    1.angular.extend var dst = {name: 'xxx', country: 'China'}; var src1 = {name: 'yyy', age: 10}; var s ...