PHPでファイルアップロードするとき…

文字コードがSJISだと、ファイル名に「ソ」とか「表」などの0x5c(\)を含む文字があると文字化けしますよね。

こういうときはファイル名だけ別のフォームデータとして送れば文字化けしていないファイル名を使用することができます。

以下はサンプル。

—————————————–
a.php

<html>
<head>
<script type=”text/javascript”>
function saveFilename()
{
document.all.upldfilename.value = document.all.upldfile.value;
}
</script>
</head>
<body>
<form enctype=”multipart/form-data” method=”post” action=”b.php” onsubmit=”saveFilename();”>
<input type=”file” name=”upldfile” id=”upldfile”>
<input type=”hidden” name=”upldfilename” id=”upldfilename”>
<input type=”submit”>
</form>
</body>
</html>
—————————————–
b.php

<html>
<head>
</head>
<body>
<p>オートグローバル$_FILESでは文字化けする</p>
<p>
<?php
echo $_FILES[‘upldfile’][‘name’];
?>
</p>

<p>こちらは文字化けしない</p>
<p>
<?php
echo mb_substr($_POST[‘upldfilename’], mb_strrpos($_POST[‘upldfilename’], “\\”)+1);
?>
</p>
</body>
</html>
—————————————–

php.ini とかで文字化けしない方法があるんじゃないかと思って何時間か調べたけど、見つからなかったのでこの方法で逃げました。

「PHPでファイルアップロードするとき…」への5件のフィードバック

  1. どこのページでも解決策がありませんでした。すばらしいです!!
    ありがとう、参考にさせていただきます。

  2. 先のコメントと同じですが...
    どこのページでも解決策が無いか、若しくはすごく複雑でした。すばらしい! 簡単に解決しました。

  3. 過去の記事でご覧になられていないかもですが、一応ご報告いたします。
    今年に入ってから気づいたのですが、FireFox、Chrome、Operaで文字化けを回避できなくなってしまいました。
    IE、Safariでは問題なかったのでブラウザの仕様なのですかね(´・_・`)
    まだ解決方法を模索中です・・・。

  4. 古い記事の古いコメントを見つけたので一応返信を。
    a.phpの
    document.all.upldfilename.value = document.all.upldfile.value;

    document.all.upldfilename.value = encodeURIComponent(document.all.upldfile.value);
    にして、b.phpの
    $_POST[‘upldfilename’]

    rawurldecode($_POST[‘upldfilename’])
    にしたらできませんかね。試してないけど。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です