//用以解决中文不能显示出来的问题
$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
)可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓