在 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('下载失败');
}
相关文章