php文件下载(解决文件下载后多几个字节的问题) 与封装成类的例子
php文件下载比较常见,网上的资料比较多,在此不再强调怎么去实现(因为也是网上看的)。下面主要说明的是下载代码的注意点。
php下载文件主要是把文件以字节流直接输出,也就是echo fread($file, filesize($file_name));,这里要注意的是如果你在代码之前(或之后)有输出,也可能被写入下载的文件中,解决的方法是使用 ob_start();和ob_end_clean();来清除前面的输出,后面的输出直接使用@fclose($file);exit(0);来解决。
代码如下:
- ob_start();
- $file_name = iconv("utf-8","gb2312",$file_name);
- if (!is_file($file_name)){
- echo "url error!";
- } else {
- $ua = $_SERVER["HTTP_USER_AGENT"];
- if (preg_match("/MSIE/", $ua)) {
- $encoded_filename = urlencode(basename($file_name));
- $encoded_filename = str_replace("+", "%20", $encoded_filename);
- $con_dis = 'Content-Disposition: attachment; filename="' . $encoded_filename . '"';
- } else if (preg_match("/Firefox/", $ua)) {
- $con_dis = 'Content-Disposition: attachment; filename*="utf8\'\'' . basename($file_name) . '"';
- } else {
- $con_dis = 'Content-Disposition: attachment; filename="' . basename($file_name) . '"';
- }
- $file = fopen($file_name, "r");
- //输入文件标签
- ob_end_clean();Header("Content-type: application/octet-stream");Header("Accept-Ranges: bytes");Header("Accept-Length: ".filesize($file_name));Header($con_dis);
- //输出文件内容
- //读取文件内容并直接输出到浏览器
- echo fread($file, filesize($file_name));@fclose($file);
- exit(0);
- }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
class FileDown { public $fileName ; public $fileSize ; //转码 gb2312 function __construct( $fileName ){ $this ->fileName=iconv( "utf-8" , "gb2312" , $fileName ); } function Down (){ //$_SERVER['DOCUMENT_ROOT']当前运行脚本所在的文档根目录。在服务器配置文件中定义。 $path = $_SERVER [ 'DOCUMENT_ROOT' ]. "/12/" . $this ->fileName; if (! file_exists ( $path )){ die ( "文件不存在" ); } $fp = fopen ( $path , "r" ); //读入 $this -> fileSize = filesize ( $path ); //返回文件的头 浏览器靠头识别下载 //返回 //返回的文件类型 流 可以是文本 二进制 header( "Content-type: application/octet-stream" ); //按照字节大小返回 header( "Accept-Ranges: bytes" ); //返回文件大小 header( "Accept-Length: $this->fileSize" ); //这里客户端的弹出对话框,对应的文件名 header( "Content-Disposition: attachment; filename=" . $this ->fileName); $count =0; $buffer =1024; while (! feof ( $fp )&& $this -> fileSize - $count >0){ $fileData = fread ( $fp , $buffer ); $count += $buffer ; echo $fileData ; } fclose( $fp ); } } $fd = new FileDown( "白羊座.png" ); $fd ->Down (); |
php文件下载(解决文件下载后多几个字节的问题) 与封装成类的例子的更多相关文章
- android动画特效之解决解决移动后闪烁现象,解决输入法弹出后位置回复原状,解决两个动画叠加
以下代码实现的效果是: BoundOpenView从居中移动到顶部,移动完后,BoundSendView从隐藏变为显示,并从顶部移动BoundOpenView下方20dp处,同时透明度慢慢增加. pr ...
- 转载: Centos7 升级python3,解决升级后不兼容问题
Centos7配置更新国内yum源 http://blog.csdn.net/qingguiyu/article/details/50721956 Centos7 升级python3,解决升级后不兼容 ...
- linux中如何解决克隆后的电脑的问题
1.如何解决克隆后的电脑的网络问题 克隆出来的电脑,IP地址,网卡都是重复的,不能直接使用,需要修改 1)vim /etc/udev/rules.d/70-persistent-net.rules ...
- redis设置密码,解决重启后密码丢失及自启服务配置
一.安装redis redis3.0及redisManage管理工具 链接:https://pan.baidu.com/s/1p5EWeF2Jgsw9xOE1ADMmRg 提取码:thyf 二.red ...
- 解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题
解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题 错误提示信息 There might be a problem with t ...
- 我最近买的书里面带的CD盘,放电脑里后,说是0字节,但是可以播放,不能把里面的东西复制出来
我最近买的书里面带的CD盘,放电脑里后,说是0字节,但是可以播放,不能把里面的东西复制出来,有track1,track2之类的文件,都只有几十字节大,请问有没有什么方法把里面的音乐复制出来??? 用w ...
- 为Windows Azure Web站点添加MIME类型解决文件下载失败的问题
这几天在倒腾Autodesk 360 Viewer,前面的文章也介绍过了,这将是一个全新的在线模型浏览工具.我做了个实验,把A360Viewer放在一个web 站点,然后发布到Windows Azur ...
- winform中dataGridView单元格根据值设置新值,彻底解决绑定后数据类型转换的困难
// winform中dataGridView单元格在数据绑定后,数据类型更改困难,只能迂回实现.有时候需要将数字变换为不同的文字描述,就会出现int32到string类型转换的异常,借助CellFo ...
- 安装VMWare tools,以及解决安装后/mnt中有hgfs但没共享文件的方法
一.首先是安装VMWare tools 安装过程可参考:Installing VMware Tools in an Ubuntu virtual machine 安装成功后,可看的如下信息: ...
随机推荐
- sql server 表结构 导出 到excel
SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, -- 字段序号 = a.colorder, 字段 ...
- kbmMW 5.06.20试用笔记
1.kbmMWConfiguration自动备份配置文件的问题还没有修正. 下面是以前写过的内容,再一次在新闻组中提出这个问题: kbmMW提供一个强大的配置信息管理对象,前期译过这个对象的介绍,在使 ...
- CentOs下mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz压缩包的安装
之前写过一篇mysql在windows下的安装(猛击这儿),linux下用的比较少,最近切换到linux服务器了,发行mysql安装和windows下有所不同,只记录压缩包方式安装,rpm包类似 1. ...
- 题目1001:A+B for Matrices
题目1001:A+B for Matrices 时间限制:1 秒内存限制:32 兆 题目描述: This time, you are supposed to find A+B where A and ...
- OpenCV-bwLabel-实现图像连通组件标记与分析
OpenCV实现图像连通组件标记与分析- matlab bwLabel; code: #include <opencv2/opencv.hpp> #include <iostream ...
- 服务器购买+建站流程教程——适合新手没有经验的人Chinar总结
服务器购买购买教程 本文提供全图文流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创 ...
- CodeForces - 1093F:Vasya and Array (DP&计数)
题意:N,K,L,以及给定长度为N的序列,表示其对应的颜色,-1表示还没有涂色,现在让你去涂色,使得最后没有大于等于L的连续的同色的情况. 思路:我们用dp[i][j]表示第i个位置颜色为j的合法方案 ...
- SUST OJ 1674: 入侵与反击(最长不下降子序列)
1674: 入侵与反击 时间限制: 1 Sec 内存限制: 128 MB提交: 229 解决: 28[提交][状态][讨论版] 题目描述 A国部署的反导系统遇到了一个致命BUG,那就是每一次发射的 ...
- SysRq魔法键的使用
SysRq魔法键的使用 1.SysRq简介它能够在系统处于极端环境时响应按键并完成相应的处理.这在大多数时候有用.SysRq 经常被称为 Magic System Request,它被定义为一系列按键 ...
- OASGraph 转换rest api graphql 试用
创建rest api lb4 appdemo 参考提示即可 安装 OASGraph git clone https://github.com/strongloop/oasgraph.git cd oa ...