服务器提供一个文件下载,一般使用一个url指向服务器中的文件即可提供下载。
但这样就不能进行统计,权限检测等操作。
因此,一般使用php提供下载,代码如下:
<?php $file = 'test.zip'; if(file_exists($file)){ header('content-type:application/octet-stream'); header('content-disposition:attachment; filename='.basename($file)); header('content-length:'.filesize($file)); readfile($file); } ?>处理中文文件名:
<?php $file = 'test.zip'; $filename = '中文.zip'; if(file_exists($file)){ $user_agent = $_SERVER['Http_User_agent']; $encode_filename = rawurlencode($filename); if(preg_match("/MSIE/", $user_agent)){ header('content-disposition:attachment; filename="'.$encode_filename.'"'); }else if(preg_match("/Firefox/", $user_agent)){ header("content-disposition:attachment; filename*=\"utf8''".$filename.'"'); }else{ header('content-disposition:attachment; filename="'.$filename.'"'); } readfile($file); } ?>使用php readfile,需要经过php这层,如果可以直接通过apache将文件发送给用户,不经过php这层,将会提高下载速度。
安装:
sudo apxs2 -cia mod_xsendfile.c sudo a2enmod xsendfile sudo /etc/init.d/apache2 restartapxs2 用于编译apache module,需要安装apache2-dev
<Directory> XSendFile On </Directory>代码如下:
<?php $file = 'test.zip'; $filename = '中文.zip'; if(file_exists($file)){ $user_agent = $_SERVER['Http_User_agent']; $encode_filename = rawurlencode($filename); if(preg_match("/MSIE/", $user_agent)){ header('content-disposition:attachment; filename="'.$encode_filename.'"'); }else if(preg_match("/Firefox/", $user_agent)){ header("content-disposition:attachment; filename*=\"utf8''".$filename.'"'); }else{ header('content-disposition:attachment; filename="'.$filename.'"'); } header('X-Sendfile:'.$file); } ?>