php文件下载原理
ccpp
10年前
$filename="1.jpg"; /* 如果文件名是中文加上这一句,否则找不到文件 $filename = iconv("utf-8","gb2312",$filename); */ header("Content-type:image/jpg"); //告诉浏览器要接受的数据类型 //header("Content-type:application/octet-stream"); 二进制传送 header('Content-Disposition:attachment:filename="down.jpg'); //弹出下载框时标明的下载的文件的名称 header("Content-Length:".filename($filename)); //告诉浏览器接受的文件大小 $fp=fopen($filenmae,"r"); while(!feof($fp)){ echo fread($fp,1024); //此时输出的数据不会输出到浏览器页面,而会直接保存到内存 } fclose($fp); // readfile($filename); 快捷读取文件
现在的浏览器能显示的文件格式很多,比如图片,网页文件,文本,还有很多,如果是浏览器能够识别的类型,那么浏览器默认输出显示到页面,如果
是浏览器不认识的类型,那么默认会弹出下载框提示下载,如果你希望你的数据需要保存而不是直接在浏览器上显示,那么你就要特别声明,
怎么声明了呢?
这属于http协议的内容,利用php的header函数改变默认的http协议,直接在headr函数里写http协议字符串即可,
为什么header函数要写在任何html内容的最前面?这也是http协议的相关内容,简单解释一下
HTTP协议包含消息头和消息体(传送的内容),既然要使用http协议那么我们就必须满足http协议的规则,消息头必须需在消息体之前,这样浏览器才能够正确
解析,这也就是header函数之前不能有任何的输出的与原因,
消息头中是规则,消息体是内容,上面代码中的几条header函数就是告诉这次传送的规则,
刚开始我在怀疑下面这行代码可不可以不要,(当时不知道HTTP协议的规则)
header("Content-Length:".filename($filename));
如果你使用抓包工具试一下就会看到每一次接受的服务器的响应中都会有接受文件的大小,默认都有的,其实浏览器并不是我们想的那么智能,
他并不知道接受的数据有多大,需要告诉它应该接受多少,否则会出现数据丢失或多出垃圾信息,这不是本篇文章的主要内容,了解相关内容可通过谷歌搜索