Re: ファイル名のマルチバイト文字対応

2011年5月1日 at 11:43

マルチバイト化でちょっと違ったアプローチをしたとこと、簡単にファイル名のマルチバイト化ができましたので、参考までお知らせします。
具体的には、/concrete/helpers/file.php を /helpers/file.php
にコピーし、クラス名をSiteFileHelperに変えます。
変更するファンクションは
public function forceDownload($file)
public function sanitize($file)
の2つだけです。追加するコードも合わせて20行ほどで済みました。

public function forceDownload($file)
では
$filename = basename($file);
の行の後に、
$useragent = $_SERVER['HTTP_USER_AGENT'];
if (strstr($useragent, 'Windows') !== false ||
strstr($useragent, 'Mac_') !== false) {
$filename = mb_convert_encoding($filename, 'SJIS', APP_CHARSET);
}
の5行を加えます。

public function sanitize($file)
では
$file = preg_replace(array("/[\s]/","/[^0-9A-Z_a-z-.]/"),array("_",""), $file);
の行をコメントアウトして以下の15行を加えます。
$file = preg_replace("/[\s]/","_", $file);
if(strpos($_SERVER['HTTP_USER_AGENT'], 'Windows') == false)
$separater = '/';
else
$separater = '\\';

$len = strlen($file);
$i = $len-1;
while ($i > 0) {
if (substr($file, $i, 1) == $sepalater) break;
$i--;
}
if ($i != 0) $i++;
$newlen = $len - $i;
$file = substr($file, $i, $newlen);

Windowsのサーバ環境では試していませんが、Linuxのサーバ環境では
これでOKでした。

Re: Re: ファイル名のマルチバイト文字対応

2011年5月5日 at 14:15
yamanoiです。

safariでもOKでしたか。
 

Re: Re: Re: ファイル名のマルチバイト文字対応

2011年5月5日 at 20:22
yamanoiさんご指摘ありがとうございます。

試してみたら、Safariでのダウンロードでファイル名が文字化けしました。
いろいろ試してみたら、SafariはUTF-8でファイル名を受け取るのですね、
ということで、やっつけ

forceDownload($file)の
if (strstr($useragent, 'Windows') !== false ||
strstr($useragent, 'Mac_') !== false) {
$filename = mb_convert_encoding($filename, 'SJIS', APP_CHARSET);
}の後に
if(strstr($useragent, 'Safari')) $filename = basename($file);
の1行を加えてうまくいきました。