Products
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