如果是日语名称,则IE8下载文件名将变成垃圾文件

Har*_*rts 0 php unicode internet-explorer cakephp download

我已经将数据库归类设置为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',
    );
}
Run Code Online (Sandbox Code Playgroud)

我设置了下载二进制文件,如下所示:

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

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

有人知道如何解决吗?

Sak*_*tel 5

我不确定CakePHP如何处理这种情况,但是IE在发送的文件名标头中的Unicode字母时遇到问题content-disposition: attachment。因此,要在IE中解决此问题,我们需要先对文件名进行url编码,然后再将其设置为标头:

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

所以我不确定如何在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);
Run Code Online (Sandbox Code Playgroud)