日期:2014-05-17  浏览次数:20609 次

php文件下载乱码问题
我想添加一个文件上传下载功能,由于文件可能较大,所以思路是在数据库中存储文件在服务器上的路径,下载时根据路径读取文件。最开始在上传时页面文件列表显示的中文文件名为乱码,添加了
mysql_query("SET NAMES 'utf8'");
之后解决。后来在下载时存储的文件名为乱码,同样添加这个code解决。但是下载的文件里面的中文就成乱码了。我用txt文本测试,英文没问题,UTF-8格式的文本也没问题,默认的ANSI就成乱码,当然上传word文件也是乱码。大家帮忙看看应该怎么改,不知道是传到服务器就是乱码,还是下载下来格式没转换,我的数据库是UTF-8编码的,母版页也是UTF-8编码。

<?php		
function DownloadFile($mineid,$notice=null){
global $smarty;
needLogin();
//session_cache_limiter('private'); 
$session=Session::start();
$curUser = $session->curUser;
$logger = new CategoryLogger('log_definition');
if($notice!="auto")notice($notice);

$id=$mineid;//要下载文件的ID  
if(!isset($id) or $id=="") die("error:id none");  //定位记录,读出 
$conn=mysql_connect('10.4.16.102','root','abc') or die('Unable to connect .');   
    mysql_select_db('greenmine',$conn) or die(mysql_error($conn));
mysql_query("SET NAMES 'utf8'");
    $sql=  "select * from file where id=$id";  
$result=  mysql_query($sql);  
if(!$result) die("error:mysql query");  
$num=mysql_num_rows($result);  
if($num<1) die("error:no this recorder"); 
 
$data=mysql_result($result,0,"file_data");  //文件存储路径
$type=mysql_result($result,0,"file_type");  
$name=mysql_result($result,0,"file_name"); 
mysql_close($conn);  

$file_name=$name;
$file_dir=$data;
if   (!file_exists($file_dir))   {   //检查文件是否存在  
   echo   "文件找不到";  
   exit;    
   }   else   {  
$filePath = $file_dir;//此处给出你下载的文件在服务器的什么地方   
    $fileName = $file_name;   
    //此处给出你下载的文件名   
    $file = fopen($filePath, "r"); //   打开文件

Header("Content-type:application/octet-stream ");
Header("Accept-Ranges:bytes ");
Header("Accept-Length:   " . filesize($filePath));
Header("Content-Disposition:   attachment;   filename= " . $fileName);   
       
    //   输出文件内容   
    echo fread($file, filesize($filePath));   
    fclose($file);   
    exit;   
  }
}
?>

------解决方案--------------------
是文件名乱码,还是文件内容乱码?
你的库中只保存文件名,而文件是独立保存的。不是这样吗
打开文件要 $file = fopen($filePath, "rb");

供下载的文件名
Header("Content-Disposition:   attachment;   filename= " . $fileName);
要与用户所用操作系统配套