CakephpのCakeResponseで日本語名ファイルをダウンロードできない

cakephp 2.5.3での出来事です

public function download($path)
{
    // レイアウトの無効
    $this->autoRender = false;
    if( file_exists($fileName) === TRUE )
    {
        $this->response->file($path);
        $this->response->download(basename($path));
        return $this->response;
    }
}

なんてすれば、ファイルダウンロードできるはずが
404エラーになる..

ソースコードを追うと

//lib/Cake/Network/CakeResponse.php L1347
    $file = new File($path);
if (!$file->exists() || !$file->readable()) {
    if (Configure::read('debug')) {
        throw new NotFoundException(__d('cake_dev', 'The requested file %s was not found or not readable', $path));
    }
    throw new NotFoundException(__d('cake', 'The requested file was not found'));
}

if (!$file->exists() || !$file->readable()) {
でエラーに

Fileモデルを追っていると

//lib/Cake/Utility/File.php L86
public function __construct($path, $create = false, $mode = 0755) {
    $this->Folder = new Folder(dirname($path), $create, $mode);
    if (!is_dir($path)) {
        $this->name = basename($path);
    }
    $this->pwd();
    $create && !$this->exists() && $this->safe($path) && $this->create();
}

で、$this->name = basename($path);

.txtになってました
ロケールの問題でした..

以前公開したこちらで解決です
phpのbasenameはロケール次第で日本語が扱えない

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください