PHPでアップロードしたファイルに一連の処理を加える


// 先に php_user_filter を継承したフィルターを実装しておく
class mbstring_convert_encoding_filter extends php_user_filter {
var $from;
var $to;

function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
// 文字コードを変換する
$bucket->data = mb_convert_encoding($bucket->data, $this->to, $this->from);

$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}

function onCreate() {
$enc = explode('.', $this->filtername);
if (count($enc) != 3) return false;

$this->from = $enc[1];
$this->to = $enc[2];

return true;
}
}

// フィルタを登録する
stream_filter_register("mbstring.*", "mbstring_convert_encoding_filter")
or die("Failed to register filter");


if ( ($handle = fopen($_FILES['file']['tmp_name'], "r")) !== false) {
stream_filter_append($handle, "mbstring.sjis-win.utf-8");

while ($line = fgets($handle, 4096)) {
// 処理を書く
}
}

上記コードではマルチバイト文字が途中で切断される問題が発生する
この問題の対応については以下のソースが参考になる
http://openpear.org/repository/Stream_Filter_Mbstring/trunk/src/Stream/Filter/Mbstring.php