我们都知道php非常依赖http契约,像java或者asp.net在某些情况下是不能依赖http的,比如asp.net的winform,对于php来说php 文件操作,文件下载可以使用http请求头加php IO即可取得成就
1.首先查看下载时要使用的请求头
header("Content-type:application/octet-stream");
header("Accept-Ranges:bytes");
header("Accept-Length:".$file_Size);
header("Content-Disposition: attachment; filename=".$filename);
内容类型将不再解释。 Accept-Ranges 指示接收数据的类型或范围。 图片是二进制的,因此需要以字节的形式传输。 Accept-Length表示接收到的大小。 PHP文件下载需要告诉浏览器下载的文件有多大,最后一个是附件,过去只需要给出文件名,这个名称就是下载时显示的文件名。
2、php的文件操作出现得比较早。 当文件名是英文时php 文件操作,需要注意转码
$filename=iconv("UTF-8","GB2312",$filename);
3、php的文件下载机制是apcahe首先将文件信息读取到服务器显存中,然后利用请求头将文件的二进制信息通过浏览器发送给客户端
//判断路径是否存在
if(!file_exists($filepath)){
echo "文件不存在";
return;
}
$fp=fopen($filepath,"r");
//取得文件大小
$file_Size=filesize($filepath);
header("Content-type:application/octet-stream");
header("Accept-Ranges:bytes");
header("Accept-Length:".$file_Size);
header("Content-Disposition: attachment; filename=".$filename);
$buffer=1024;
$buffer_count=0;
while(!feof($fp)&&$file_Size-$buffer_count>0){
$data=fread($fp,$buffer);
$buffer_count+=$buffer;
echo $data;
}
fclose($fp);
feof用于判断文件是否读到末尾,fread用于将文件读入缓冲区,缓冲区大小为1024,读取时将数据输出到浏览器。 为了下载的安全,每次读取数据时都会进行字节计数。读取文件后关闭输入流
3.有时候里面的代码不太好用。 您可以清除(擦除)输出缓冲区并使用下面的代码
ob_clean();
看一下运行效果图
下载文件后没有问题
下面是完整的代码
0){
$data=fread($fp,$buffer);
$buffer_count+=$buffer;
echo $data;
}
fclose($fp);
}
downloadFile("桌面截图.png");
?>
发表评论