那项目拖了这么久了……今天写最后的“下载专区”。其中就不可避免的涉及到中文文件下载的问题。
我现在是在Windows下开发,文件路径是GBK的编码,而我的php文件用的是utf-8,所以会造成无法找到文件。但是如果每次都用mb_convert_encoding转换成gbk的格式,可能会在Linux的服务器上有出现问题。所以应该考虑比较兼容的方式。
网上搜了一下,普遍是用的下面的代码
<?php
$file = "/tmp/中文名.tar.gz";
$filename = basename($file);
header("Content-type: application/octet-stream");
//处理中文文件名
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = rawurlencode($filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
header("Content-Length: ". filesize($file));
readfile($file);
当然,测试并没有效果。
然后我就用算是取巧的办法。
$filename = '哈哈.doc';
$filePath = './Upload/file/'.$filename;
// 中文可能会出现问题
if(!file_exists($filePath)){
$filePath = mb_convert_encoding($filePath, "gbk", "utf-8");
$filename = mb_convert_encoding($filename, "gbk", "utf-8");
if(!file_exists($filePath)){
$this->error('没有找到文件,请稍后再试……');
}
}
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="'.$filename.'"');
header("Content-Length: ". filesize($filePath));
readfile($filePath);
先判断现在的utf-8编码是否可行,如果不行,把文件路径的字符串转换成gbk格式,在判断文件是否存在。
如果都不存在,则认为文件就是不存在。
不知道我这想法有没有错误呢?