[PHP-users 2390] 日本語ファイル名のアップロードについて

瀬上 孝司 php-users@php.gr.jp
Tue, 2 Oct 2001 16:34:21 +0900


マイクロ・シー・エー・デーの瀬上と申します。

表題どおり、日本語ファイル名をアップロードする際、うまくいかない
ときがあり、困っています。具体的にいうと、ファイル名に0x5cを含む
(SJISの)「ソ」「表」「申」などの漢字があると、その部分で切られて
しまい、ちゃんとファイル名が渡らなくなってしまうのです。

下記に、簡単なサンプルPHPソースを作成してみました。
このPHPファイルを実行し、例えば対象ファイルに(SJISで)

	C:\temp\ABC表1.xls

を入力しsubmitすると、変数$uploadFile_nameには、

	1.xls

しか設定されないのがわかると思います。
たぶん、ディレクトリの区切りと勘違いしているのでしょう。
これを回避する方法はなにかあるでしょうか?
実行環境は変更することはできないので、それ以外の方法でなにか
回避方法があれば教えてください。
php.iniのmagic_quotes_gpcオプションをOnにしてもだめでした。
よろしくお願いします。

●環境
OS: Windows 2000 SP1
Webサーバ: Microsoft IIS
PHP: php-4.0.7-dev (on http://www.php4win.de)
extensions: bz2, ldap, mbstring, oci8, openssl, pdf, pgsql

●php.iniの一部
[PHP]
magic_quotes_gpc = Off	; Onにしてもダメ
[MBString]
mbstring.detect_order = auto
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.internal_encoding = UTF-8
mbstring.substitute_character = none

--- uploadtest.php ---
<HTML>
<HEAD>
<TITLE>アップロードテスト</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
</HEAD>
<BODY>
<FONT SIZE=6>アップロードテスト</FONT><BR>

<?PHP
if (isset($action)) {
	if ($uploadFile!="none") {
		$upload_dir = "D:/temp/";
		echo "<P><BR>つぎのファイルをアップロードしました";
		$len = strlen($uploadFile_name);
		echo "<BR>len = ".$len;
		echo "<BR>";
		for ($i = 0; $i < $len; $i++) {
			$c = substr($uploadFile_name,$i,1);
			echo "0x".bin2hex($c)." ";
		}
		echo "<BR>";
		echo "<UL>\n";
		echo "<LI><B>".$uploadFile_name."</B> ";
		if (copy($uploadFile, $upload_dir.$uploadFile_name)) {
			echo "( ".$uploadFile_size." bytes )\n";
		}
		else {
			echo "<FONT COLOR=#ff0000>コピーに失敗</FONT>\n";
		}
	}
}
?>

<FORM ENCTYPE="multipart/form-data" METHOD=post ACTION="uploadtest.php">
<INPUT TYPE=hidden NAME=MAX_FILE_SIZE VALUE=2048000>
<TABLE>
<TR>
<TD>対象ファイル</TD>
<TD><INPUT TYPE=file NAME=uploadFile SIZE=80></TD>
</TR>
<TR>
<TD ALIGN=center COLSPAN=2>
<INPUT TYPE=submit NAME=action VALUE="アップロード">
</TD>
</TR>
</TABLE>
</FORM>

</BODY>
</HTML>
--------------------------

--
瀬上 孝司 / Segami, Takashi <sage@tokyo.microcad.co.jp>
株式会社マイクロ・シー・エー・デー 第2システム開発室
TEL: 03-5820-8912, URL: http://www.microcad.co.jp/