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はロケール次第で日本語が扱えない

phpのbasenameはロケール次第で日本語が扱えない

はまったのでメモ

ファイル名をとれる関数 basename を使って

$path = "/var/www/upload/日本語ファイル.txt";
echo basename($path);
// .txt

日本語ファイル.txtが出てきて欲しいのに、日本語部分が消えてしまいました

公式マニュアルの出番です
http://php.net/manual/ja/function.basename.php

ロケールに依存するらしい..

いまのロケールを見てみます

echo setlocale(LC_ALL, 0);
// C

Apacheのロケール、Cを引き継いでるっぽいです

setlocale(LC_ALL, 'ja_JP.UTF-8');
$path = '/var/www/upload/日本語ファイル.txt';
echo basename($path);
//日本語ファイル.txt'

で取れました
Apacheの設定変えてもいいかもしれません

CakephpでDIRECTORY_SEPARATORはDSでいい

CakephpではDIRECTORY_SEPARATORはDSでいいです

$ define(‘DS’, DIRECTORY_SEPARATOR);

してあるだけなんですが

[code lang=php:php]
$filePath = $directory . DS . 'some.txt';
[/code]

みたいな使い方です

定数のおさらいをしておきました
知らない定数もありました
http://book.cakephp.org/2.0/ja/core-libraries/global-constants-and-functions.html

Ubuntu 14.04へGoogle Chromeをインストールする

Thinkpad X240を手に入れたのでUbuntu14.04を入れてみました
Google Chromeが入ってる?ので起動しようとするとエラー..
入れなおそうといったん消して
$ sudo apt-get purge google-chrome-stable

Google Chromeのパッケージインストーラーをダウンロードします
OSにあったものを選びます
https://www.google.co.jp/chrome/browser/desktop/index.html

$ sudo dpkg -i google-chrome-stable_current_amd64.deb
(データベースを読み込んでいます … 現在 196072 個のファイルとディレクトリがインストールされています。)
Preparing to unpack google-chrome-stable_current_amd64.deb …
Unpacking google-chrome-stable (39.0.2171.95-1) over (39.0.2171.95-1) …
dpkg: 依存関係の問題により google-chrome-stable の設定ができません:
google-chrome-stable は以下に依存 (depends) します: libappindicator1 …しかし:
パッケージ libappindicator1 はまだインストールされていません。

dpkg: error processing package google-chrome-stable (–install):
依存関係の問題 – 設定を見送ります
Processing triggers for man-db (2.6.7.1-1ubuntu1) …
Processing triggers for gnome-menus (3.10.1-0ubuntu2) …
Processing triggers for desktop-file-utils (0.22-1ubuntu1) …
Processing triggers for bamfdaemon (0.5.1+14.04.20140409-0ubuntu1) …
Rebuilding /usr/share/applications/bamf-2.index…
Processing triggers for mime-support (3.54ubuntu1) …
処理中にエラーが発生しました:

とエラーが
libappindicator1が足りないので

$ sudo apt-get install libappindicator1
としてもlibindicator7がないとかでエラー

$ sudo apt-get install libindicator7
とするとlibappindicator1がないとかエラー

あれ、ループする..
Chromeが半端に入ってたのでもう一度削除
$ sudo apt-get purge google-chrome-stable

足りないものをまず入れます
$ sudo apt-get install libappindicator1
これでlibindicator7も入りました

再チャレンジ
$ sudo dpkg -i google-chrome-stable_current_amd64.deb

で、うまくはいりました