最近,项目里需要用php写个下载文件的程序,以下是我下载功能的代码:if(file_exists($file_dir.$file_name))
{
$file = fopen($file_dir.$file_name,"r"); // 打开文件
header('Pragma: public');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: pre-check=0, post-check=0, max-age=0');
header('Content-Encoding: none');
header('Content-type: application/octet-stream');//文件类型
header('Content-Disposition:attachment;filename="'.basename($file_name).'"');//文件名称
header('Accept-Ranges:bytes');
header('Content-Transfer-Encoding: binary');
header('Content-length: '.filesize($file_dir . $file_name));//文件大小
// 输出文件内容
echo fread($file,filesize($file_dir . $file_name));
fclose($file);
exit;
}
这段代码在winxp服务器上测试,没有任何问题,但是,把程序放到linux上后,任何文件,下载时文件名都变成了index.php,打开下载下来的这个php文件,内容和我服务器上放的文件的内容是一致的,服务器上放的文件并不是php文件。
另外,linux的版本是最新版的Oracle Linux。该问题困扰了我很久了,希望有高手帮忙解决!

解决方案 »

  1.   


            @ob_end_clean();
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
            header("Content-Type: application/force-download");
            header("Content-Type: application/octet-stream");
            header("Content-Type: application/download");
            header("Content-Disposition: attachment;filename={$filename}");
            header("Content-Transfer-Encoding: binary ");试试。
      

  2.   

    Debian-Linux下没有问题:而且你的header代码真确的啊,对于楼主的问题,同样不理解
      

  3.   

    你的代码在linux下没问题,我也测试过了,你应该找你这部分代码上面的代码。例如文件名是否存在问题
      

  4.   

    问题应出在 basename($file_name)你对文件的操作都是用的是 $file_dir.$file_name
    所以 $file_name 为空,也未可知
    只要文件名部分为空,就是以当前程序文件名替代另外 basenmae 不能正确的处理中文,这也是需要考虑的
      

  5.   

    跟 basename($file_name)没关系的,及时把文件名直接写死,也不行。
    我怀疑是我的oracle linux环境配置有问题,但是又不知道从哪里下手,期待高手出现啊!!
    4楼的朋友是否可以加我,qq278314051,谢谢!
      

  6.   

    OEL没弄过哦,太高端了.linux下没有好用的qq工具,所以基本不上qq。
    你将文件名直接写死也不行?那可真是奇怪了。
    OEL是用apache?
      

  7.   

    会不会是 bom 影响了啊。
      

  8.   

    你试试这个
    <?php
    set_time_limit ( 0 );
    header ( "Pragma: public" );
    header ( "Expires: 0" );
    header ( 'Content-Encoding: none' );
    header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
    header ( "Cache-Control: public" );
    header ( "Content-Description: File Transfer" );
    header ( 'Content-Disposition: attachment; filename=' . $file_name );
    header ( "Content-Transfer-Encoding: binary" );
    header ( 'Content-Length: ' . filesize ( $file_path . $file_name ) );
    readfile ( $file_path . $file_name );
    exit ();
    //$file_path存放下载的文件的路径
    //$file_name 要下载的文件的文件名,带扩展名的
    ?>