background image

//用以解决中文不能显示出来的问题 

$file_name

=iconv("utf-8","gb2312",

$file_name

); 

$file_sub_path

=

$_SERVER

['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/"; 

$file_path

=

$file_sub_path

.

$file_name

//首先要判断给定的文件存在与否 
if

(!

file_exists

(

$file_path

)){ 

echo

 "没有该文件文件"; 

return

 ; 

$fp

=

fopen

(

$file_path

,"r"); 

$file_size

=

filesize

(

$file_path

); 

//下载文件需要用到的头 

Header("Content-type: application/octet-stream"); 
Header("Accept-Ranges: bytes"); 
Header("Accept-Length:".

$file_size

); 

Header("Content-Disposition: attachment; filename=".

$file_name

); 

$buffer

=1024; 

$file_count

=0; 

//向浏览器返回数据 
while

(!

feof

(

$fp

) && 

$file_count

<

$file_size

){ 

$file_con

=

fread

(

$fp

,

$buffer

); 

$file_count

+=

$buffer

echo

 

$file_con


fclose(

$fp

); 

?> 
 
几点注意事项:

 

 
header("Content-type:text/html;charset=utf-8")的作用:在服务器响应浏览器的请求时,告诉
浏览器以编码格式为

UTF-8 的编码显示该内容 

关于

file_exists

()函数不支持中文路径的问题:因为 php 函数比较早,不支持中文,所以如果

被下载的文件名是中文的话,需要对其进行字符编码转换,否则

file_exists

()函数不能识别,

可以使用

iconv()函数进行编码转换 

$file_sub_path

() 我使用的是绝对路径,执行效率要比相对路径高 

Header("Content-type: application/octet-stream")的作用:通过这句代码客户端浏览器就能知
道服务端返回的文件形式

 

Header("Accept-Ranges: bytes")的作用:告诉客户端浏览器返回的文件大小是按照字节进行
计算的

 

Header("Accept-Length:".

$file_size

)的作用:告诉浏览器返回的文件大小 

Header("Content-Disposition: attachment; filename=".

$file_name

)的作用:告诉浏览器返回的文

件的名称

 

以上四个

Header()是必需的 

fclose(

$fp

)可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓