[PHP-users 12589] Re: 〔関連〕ファイルアップロード時にファイル名が正しく扱えない問題

keiko sakamoto php-users@php.gr.jp
Fri, 17 Jan 2003 17:23:29 +0900


こんにちは。

仲村さんの回答で、ファイルアップロードにより、フルパスを取得できるのであれば
作成頂いたmb__basename()を使用できると思うのですが、
以下のソースで$_POST['postfile']でファイル名のフルパスが取得できません。


<form enctype="multipart/form-data" action="Test.php" method="post">
	<input type="hidden" name="MAX_FILE_SIZE" value="100000">
	<input type="file" name="postfile"  size="90" class="uploadText">
	<input type="submit" value="送信">
</form>


[ Test.php ]
(1) "postfile"に C:\test\サンプル\test.txt を選択した場合
(2) "postfile"に C:\test\テスト\test.txt   を選択した場合
<?php
	$fl_name_file  =$_FILES['postfile']['name'];
	$fl_name_post  =$_POST["postfile"];
	$fl_name_encode=mb_convert_encoding ( $fl_name_file, "EUC-JP", 'eucjp-win, sjis-win, JIS');

	// (1)サンプル\\test.txt と表示される。
	// (2)test.txt と表示される。
	print $fl_name_file ;
	
	// (1)(2)何も表示されない。
	// ※ (1)においては C:\test\サンプル\test.txtが取れていれば、
	// 	  mb__basename( $fl_name_post )で解決のはず?
	print $fl_name_post ;
							
	// (1)サンプル\\test.txt と表示される。
	// (2)test.txt と表示される。
	print $fl_name_encode;
?>


という感じなのですが。
$_FILES['postfile']['name']でファイル名を得ることができるということは、
PHP側で内部的にファイルのフルパスからファイル名を切り出す処理をしていると思うのですが、
そのときに

C:\test\サンプル\test.txt
		↓ ↓ ↓
C:\test\サンプル\\test.txt

という風に文字化けしてしまい、
ファイル名がサンプル\\test.txtになっていると考えられます。


以下の設定を変更すれば回避できるのでしょうか。
> register_globals  = On
> output_buffering  = Off
> default_charset   = EUC-JP
> mbstring.language = Japanese
> mbstring.encoding_translation = On
> mbstring.http_input  = auto
> mbstring.http_output = EUC-JP
> mbstring.internal_encoding = EUC-JP
> mbstring.substitute_character = none

そもそもアップロードに関しては
$_FILES[]で値を取得するので、
POSTは使わない方がよいと考えているのですが…

やっぱり
フォルダ名、ファイル名に日本語を使用しない様にする方が無難ですかね?


質問ばかりで申し訳ありませんが、よろしくお願いします。