php下载文件后文件打不开

kunyou7003 2016-09-25 10:37:22
文件保存在服务器里,下载到客户端上,需要下载的文件是图片和pdf两种格式。
fileName和filePath是从数据库里读取的,这个举个例子
$fileName="tutu.png";
$filePath="C:/Downloads/tutu.png";
mysqli_close ( $con );
$file = fopen($filePath . $fileName, "r");

Header("Content-type:application/octet-stream ");
Header("Accept-Ranges:bytes ");
Header("Accept-Length: " . filesize($filePath . $fileName));
Header("Content-Disposition: attachment; filename= " . $fileName);
echo fread($file, filesize($filePath . $fileName));
fclose($file);
exit;
这段代码可以下载,但是下载的文件根本打不开。

而且都是1kb,这明显是不对的
请问问题出在哪里?
...全文
480 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
komyluo 2016-09-26
  • 打赏
  • 举报
回复
$fileName="tutu.png"; $filePath="C:/Downloads/tutu.png"; $file = fopen($filePath . $fileName, "r"); 即: $file = fopen("C:/Downloads/tutu.pngtutu.png", "r"); 这是笔误还是?
kunyou7003 2016-09-26
  • 打赏
  • 举报
回复
引用 2 楼 komyluo 的回复:
$fileName="tutu.png"; $filePath="C:/Downloads/tutu.png"; $file = fopen($filePath . $fileName, "r"); 即: $file = fopen("C:/Downloads/tutu.pngtutu.png", "r"); 这是笔误还是?
已改好,但是又出现新的问题了 在上传文件的部分 $file_name[$i] = $_FILES ['certificate'] ['name'][$i]; $filePath = 'C:/Downloads/' . $staff_name . "/" .basename($file_name[$i]); 我将file_name和filePath存到数据库里,下载的时候写判断if(file_exists($filePath))是不存在的(这个$filePath就是之前往数据库里存的那个),用echo打印$filePath是C:/Downloads/YAN Heather/proposal.pdf.然后我手动把路径打出来赋给$filePath1=C:/Downloads/YAN Heather/proposal.pdf.用file_exists判断$filePath是存在的。不明白为什么?这两个打印出来明明是一样的呀
kunyou7003 2016-09-26
  • 打赏
  • 举报
回复
引用 3 楼 fdipzone 的回复:
echo fread($file, filesize($filePath . $fileName)); 这里重复了 改为 echo fread($file, filesize($filePath));
已改好,但是又出现新的问题了 在上传文件的部分 $file_name[$i] = $_FILES ['certificate'] ['name'][$i]; $filePath = 'C:/Downloads/' . $staff_name . "/" .basename($file_name[$i]); 我将file_name和filePath存到数据库里,下载的时候写判断if(file_exists($filePath))是不存在的(这个$filePath就是之前往数据库里存的那个),用echo打印$filePath是C:/Downloads/YAN Heather/proposal.pdf.然后我手动把路径打出来赋给$filePath1=C:/Downloads/YAN Heather/proposal.pdf.用file_exists判断$filePath是存在的。不明白为什么?这两个打印出来明明是一样的呀
kunyou7003 2016-09-26
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
1、你用文本编辑工具打开 tutu.png 开看,虽然是乱码,但仍可以看出与原文件的区别的 2、文件大小的比较,要精确到字节,kb 太粗糙了 你有 $filePath="C:/Downloads/tutu.png"; 显然是 windows 系统,而在 windows 系统中,打开二进制文件要有 b 属性 即 "r" 应为 "rb" 这一点手册中已经说的很清楚了,请不要视而不见 现在都喜欢用时髦的 utf-8 字符集,那么 BOM 头将会破坏图片数据,请注意删除(尤其是 windows 下) 题外:其实 utf-8 是西方人给我们挖的一个坑。不是说经济发展速度高吗?不是说经济总量世界第二了吗?一个小小的 utf-8 就将近一半的资源化为无有了!
$file_name[$i] = $_FILES ['certificate'] ['name'][$i]; $filePath = 'C:/Downloads/' . $staff_name . "/" .basename($file_name[$i]); 我将file_name和filePath存到数据库里,下载的时候写判断if(file_exists($filePath))是不存在的(这个$filePath就是之前往数据库里存的那个),用echo打印$filePath是C:/Downloads/YAN Heather/proposal.pdf.然后我手动把路径打出来赋给$filePath1=C:/Downloads/YAN Heather/proposal.pdf.用file_exists判断$filePath是存在的。不明白为什么?这两个打印出来明明是一样的呀
xuzuning 2016-09-26
  • 打赏
  • 举报
回复
1、你用文本编辑工具打开 tutu.png 开看,虽然是乱码,但仍可以看出与原文件的区别的 2、文件大小的比较,要精确到字节,kb 太粗糙了 你有 $filePath="C:/Downloads/tutu.png"; 显然是 windows 系统,而在 windows 系统中,打开二进制文件要有 b 属性 即 "r" 应为 "rb" 这一点手册中已经说的很清楚了,请不要视而不见 现在都喜欢用时髦的 utf-8 字符集,那么 BOM 头将会破坏图片数据,请注意删除(尤其是 windows 下) 题外:其实 utf-8 是西方人给我们挖的一个坑。不是说经济发展速度高吗?不是说经济总量世界第二了吗?一个小小的 utf-8 就将近一半的资源化为无有了!
傲雪星枫 2016-09-26
  • 打赏
  • 举报
回复
echo fread($file, filesize($filePath . $fileName)); 这里重复了 改为 echo fread($file, filesize($filePath));

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧