其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

PHP解决ie类浏览器下载中文名乱码问题

GG网络技术分享 2025-03-18 16:17 0


在 PHP 中,可以使用 header 函数来设置响应头,包括 Content-Disposition 头。该头用于指示浏览器如何处理响应内容,包括是否将其保存为文件,并指定保存文件时的文件名。

然而,在 IE 浏览器中,由于其对文件名编码的特殊要求,如果文件名包含中文等非 ASCII 字符,可能会出现乱码或不被识别的情况。

解决这个问题,可以借助 urlencode 或 rawurlencode 函数对文件名进行 URL 编码,以确保其符合 URL 规范,然后将编码后的文件名通过响应头传送给浏览器。例如:

$filename = \"中文名.cdr\";

$encodedFilename = urlencode($filename);

header(\"Content-Disposition: attachment;filename=\\\"$encodedFilename\\\"\");

或者:

$filename = \"中文名.cdr\";

$encodedFilename = rawurlencode($filename);

header(\"Content-Disposition: attachment;filename=\\\"$encodedFilename\\\"\");

这样处理之后,IE 浏览器就可以正确地识别和保存文件名了。需要注意的是,其他浏览器也可以正确地处理 URL 编码后的文件名,因此这种处理方法通常对所有浏览器都适用。

实际案例代码

function wpdown()

{

$id = isset($_GET[\'id\']) ? $_GET[\'id\'] : 0;

if(!$id) {

$this->error(\'非法下载\');

}

$where[\'id\'] = $id;

$row = M(\'wpfile\')

->where($where)->find();

if(empty($row[\'url\'])) {

$this->error(\'数据不存在\');

}

$realFile=SITE_PATH.trim($row[\'url\'],\'/\');

if(is_file($realFile)) {

// 文件类型,作为头部发送给浏览器

$filesize = $row[\'file_size\'];

$timestamp = time();

ob_end_clean();

header(\'Last-Modified: \' . gmdate(\'D, d M Y H:i:s\', $timestamp + 86400) . \' GMT\');

header(\'Expires: \' . gmdate(\'D, d M Y H:i:s\', $timestamp + 86400) . \' GMT\');

header(\'Cache-control: max-age=86400\');

header(\'Content-Encoding: none\');

$encodedFilename = urlencode($row[\'original_name\']);

header(\"Content-Disposition: attachment; filename=\\\"{$encodedFilename}\\\"\");

// header(\"Content-type: application/vnd.corel-draw\");

header(\"Content-Transfer-Encoding: binary\");

$filesize && header(\"Content-Length: $filesize\");

$i = 1;

while (!@readfile($realFile)) {

if (++$i > 3) break;

}

exit;

}

$this->error(\'下载失败\');

}


标签: 文件名 浏览器

提交需求或反馈

Demand feedback