【问题标题】:IE8 download filename become garbage if it's a Japanese nameIE8 下载文件名如果是日文名就会变成垃圾
【发布时间】:2013-05-29 22:38:47
【问题描述】:

我已将我的数据库排序规则设置为utf8_unicode_ci,并在我的 CakePHP 数据库设置中。

class DATABASE_CONFIG {
    public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'xxx',
        'login' => 'xxx',
        'password' => 'xxx',
        'database' => 'thisisdatabase',
        'prefix' => '',
        'encoding' => 'utf8',
    );
}

我这样设置下载二进制文件:

$this->viewClass = 'Media';
$params = array(
    'id'        => $download_list[0],
    'download'  => true,
    'extension' => $download_file_ext,
    'path'      => $fileDownloadPath . DS,
);
$this->set($params);

当用户上传文件时,文件名将在数据库中记录为unicode-utf8。当我通过 Chrome、FF 下载时,结果很好(日文名称仍然完好无损)。但是当我通过 IE 下载时,文件名是垃圾。虽然文件本身很好(我可以打开它等)。

有人知道怎么解决吗?

【问题讨论】:

  • 您是否在 http 响应中设置了适当的 utf 标头?整个渲染管道必须保持一致。
  • @MarcB 你能解释一下怎么做吗?我不知道标题的东西。谢谢
  • 在您的数据库配置中,我认为您也可以指定排序规则。如果我没记错的话,如果你使用 utf8 编码,它默认为 utf8_general_ci 排序规则。尝试这样做并保存另一个文件,看看它是否有效。

标签: php internet-explorer cakephp unicode download


【解决方案1】:

我不确定 CakePHP 是如何处理这种情况的,但 IE 无法在 content-disposition: attachment 的文件名标头中发送 Unicode 字母。所以要在 IE 中解决这个问题,我们需要在将文件名设置到标题之前对文件名进行 url 编码:

$filename = 'someunicodefilename.txt';
if(// IE) {
   $filename = urlencode($filename);
}
header('Content-Disposition: attachment; filename="' . $filename . '"');

所以我不确定如何在 CakePHP 中实现这一点,但你可以试试这个:

$this->viewClass = 'Media';
$filename = 'someunicodefilename.txt';
if(// IE) {
   $filename = urlencode($filename);
}

$params = array(
    'id'        => $download_list[0],
    'name'      => $filename,
    'download'  => true,
    'extension' => $download_file_ext,
    'path'      => $fileDownloadPath . DS,
);
$this->set($params);

【讨论】:

    猜你喜欢
    • 2016-10-26
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2012-03-04
    相关资源
    最近更新 更多