最近,项目里需要用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。该问题困扰了我很久了,希望有高手帮忙解决!
{
$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。该问题困扰了我很久了,希望有高手帮忙解决!
@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 ");试试。
所以 $file_name 为空,也未可知
只要文件名部分为空,就是以当前程序文件名替代另外 basenmae 不能正确的处理中文,这也是需要考虑的
我怀疑是我的oracle linux环境配置有问题,但是又不知道从哪里下手,期待高手出现啊!!
4楼的朋友是否可以加我,qq278314051,谢谢!
你将文件名直接写死也不行?那可真是奇怪了。
OEL是用apache?
<?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 要下载的文件的文件名,带扩展名的
?>