PHP实现中文名称文件下载

时间:2023-02-06 13:09:34

以下是下载的代码

public function download($file_name)
{
$file_path = public_path('uploads');
// utf-8中文名字必须转化,不认会乱码
$file_name = iconv('utf-8', 'gb2312', $file_name);
if (!file_exists($file_path . '\\' . $file_name)) {
return '文件未找到!';
} else {
$file = fopen($file_path . '\\' . $file_name, 'r');
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: ".filesize($file_path . '\\' . $file_name));
Header("Content-Disposition: attachment; filename=" . $file_name);

// 大文件分段下载,减轻一次性读取文件造成的服务器压力,如果是类似.exe的文件或者压缩包使用分段读取会造成文件无法正常使用,原因在下文
$buffer = 1024;
$file_count = 0;
$file_size = filesize($file_path . '\\' . $file_name);

while(! feof($file) && $file_count < $file_size)
{
$file_con = fread($file, $buffer);
$file_count += $buffer;
echo $file_con . '<br/>'; // 输出文件内容
}

// 输出文件内容
/* echo fread($file,filesize($file_path . '\\' . $file_name));
fclose($file);
exit; */
}
echo $file_name;
}

一、大文件下载:用下面的这段带代码(注意:如果下载.exe或者压缩包之类会造成下载后无法正常使用的情况。)

例1::.exe文件

报错如下

PHP实现中文名称文件下载


例2:压缩文件

错误信息

PHP实现中文名称文件下载

// 大文件分段下载,减轻一次性读取文件造成的服务器压力,如果是类似.exe的文件或者压缩包
$buffer = 1024;
$file_count = 0;
$file_size = filesize($file_path . '\\' . $file_name);

while(! feof($file) && $file_count < $file_size)
{
$file_con = fread($file, $buffer);
$file_count += $buffer;
echo $file_con . '<br/>'; // 输出文件内容
}


二、一般的图片之类的小文件下载直接用下面注释的这段代码

// 输出文件内容
/* echo fread($file,filesize($file_path . '\\' . $file_name));
fclose($file);
exit; */

注意:

中文名字需要用到这个php 内置函数
$file_name = iconv('utf-8', 'gb2312', $file_name);
这样做其实也对着了,看着确实是把utf-8转化为gb2312了,但是实际运行的话,往往都是以失败告终的,原因呢?

原因实际上也很简单,因为任何的函数都是执行错误的时候,同时很不幸的是iconv();就很终于出现错误。现在给你正确的答案。

$file_name = iconv('utf-8', 'gb2312//IGNORE', $file_name);

很简单的,只要后面加上一个//IGNORE就行,加上这个就可以是ICONV()函数忽略错误,继续执行。


同理,要像把gb2312换为utf-8只要写上 $file_name = iconv('gb2312', 'utf-8//IGNORE', $file_name);就行