<?php
$file_name="Koala.jpg";
if(!file_exists($file_name)){
echo "文件不存在";
return;
}
$fp=fopen($file_name,"r");
$file_size=filesize($file_name);
echo $file_size;
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: $file_size");
header("Content-Disposition: attachment; filename=".$file_name);
$buffer=1024;
while(!feof($fp)){
$file_data = fread($fp,$buffer);
echo $file_data;
}
fclose($fp);
?>
回复讨论(解决方案)
将echo $file_size;去掉
貌似不行,我这句是把这句话后面的注销掉后,为了看字节数才后来加的,发帖子的时候忘记去掉了
错误原因:
你用文本方式打开了二进制文件
这个问题图片处理经常遇到 要用
$file = fopen($file_name,"rb");
在操作二进制文件时如果没有指定 "b" 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 \r\n 字符的奇怪问题。
谢谢楼上,我试了试,貌似还是和原来一样的,不过还是谢谢你
跟我前段时间做的差不多,也是多几个字节,然后下载的图片打开失败
下面是解决办法,找了很久才搜到的
//代码之前(或之后)有输出,也可能被写入下载的文件中,所以下载的时候多出几个字节
//下载文件多出几个字节的解决方法是:使用ob_start();和ob_end_clean();来清除前面的输出;
ob_end_clean();
//http 下载需要的响应头
header("Content-type: application/octet-stream"); //返回的文件
header("Accept-Ranges: bytes"); //按照字节大小返回
header("Content-length: $file_size"); //返回文件大小
header("Content-Disposition: attachment; filename=".$name);//这里客户端的弹出对话框,对应的文件名
究竟是多几个字节,还是少几个字节呢?
多几个字节是可以找到代码上的原因的,少几个字节应该就是图片本身的问题了
测试可以的,我只注释了 echo $file_size;
$file_name="maze.png";if(!file_exists($file_name)){echo "文件不存在";return;}$fp=fopen($file_name,"r");$file_size=filesize($file_name);//echo $file_size;header("Content-type: application/octet-stream");header("Accept-Ranges: bytes");header("Accept-Length: $file_size");header("Content-Disposition: attachment; filename=".$file_name);$buffer=1024;while(!feof($fp)){$file_data = fread($fp,$buffer);echo $file_data;}fclose($fp);