Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

「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ってこうでしたっけか?