「multipart/form-data使ってアップロード」で助けて〜
解決法については追記も参照してください
なんか、すんごい勘違いしてるような気もしなくもないですが、もうgdgdです。。。助けて。。。orz
現象
- multipart/form-dataなフォームからPOSTすると、$_POST・$_FILESに含まれるマルチバイトなデータがinternal_encodingに変換されない
- なので、そのまま表示すると化けて見える
- mb_convert_encodingでinternal_encodingに変換すると正しく表示される
- 通常のapplication/www-form-urlencodedなformからPOSTすると正しく表示される
環境
- CentOS4.6
- Apache2.2.6+PHP5.2.6、Apache2.0.61+PHP4.4.8
- すべてソースからコンパイル
- マルチバイト系のconfigureオプションは、いずれも以下の通り
--enable-zend-multibyte --enable-mbstring=shared
- マルチバイト系のphp.iniの設定はいずれも以下の通り
output_handler = mb_output_handler extension=mbstring.so [mbstring] mbstring.language = Japanese mbstring.internal_encoding = eucjp-win mbstring.http_input = sjis-win mbstring.http_output = sjis-win mbstring.encoding_translation = On mbstring.detect_order = sjis-win mbstring.substitute_character = none mbstring.func_overload = 0 mbstring.strict_encoding = On default_charset = "sjis-win" mbstring.script_encoding = sjis-win
検証ソース(ファイルエンコーディング:Shift_JIS)
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <?php array_key_exists('title', $_POST) ? var_dump($_POST['title']) : ''; array_key_exists('attachment', $_FILES) ? var_dump($_FILES['attachment']) : ''; ?> 日本語 <form action="" method="post" enctype="multipart/form-data"> <input type="text" name="title"> <input type="file" name="attachment"> <input type="submit"> </form> <form action="" method="post"> <input type="text" name="title"> <input type="submit"> </form> </body> </html>
備考
- internal_encoding == http_outputが同一エンコーディングなら正しく変換される
- というか、変換しなくてそのままスルーしたらうまくいってる、という感じがするけど。。。
PHP5.2以降、こういうもんでしたっけか?つか、PHP4.4ってこうでしたっけか?
追記(2008/07/28 13:10)
このエントリに続く2エントリで、解決法をまとめてあります。