【PR】 マジックリスニングなど英語教材比較
【PR】 ディズニーの英語システム
【PR】 TOEIC750点保証講座
【PR】 足裏健康法・樹液シート
 

ネットスケープ4.Xでファイルのアップロードができない



So-netの月額料金が最大2ヶ月無料


ファイル選択:
  ユーザーがファイルをブラウザからアップロードできるフォームを画像掲示板などで設置する場合に、いろいろと不可解なエラーに出くわすことがあります。

このホームページのテーマである文字化け・文字コードに関連しているものとしては、ネットスケープ4.X(正確にはネットスケープ4.75を除くネットスケープ4.X。Mac版ネットスケープ4.7では、日本語のファイル名は自動的にエンコードされるようで、問題は発生しませんでしたが、他のバージョンではどうかは定かではありません。)において、ファイルのアップロードに失敗する場合があることです。もちろん、画像ファイルが壊れているとかではなくてです。

本来的には、Webmaseterもしくはプログラマーが、サービスのリリース前に、メジャーなブラウザで全てチェックすべきではありますが、どうしてもチェック漏れが生じてしまうことがあります。JavascriptやCSS(スタイルシート)がブラウザによって挙動が違うことは分かっていても、まさかIEで動くファイルアップロードプログラムがネットスケープでは動かないことは、なかなか想像できないと思います。私もそうでした。CGIやPHPはサーバサイドで動くわけだから、ユーザーの環境に依存しないと思っていました。

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>ファイルのアップロードのテスト</title>
</head>
<body bgcolor=#FFFFFF>
<form enctype="multipart/form-data" action="./upload.cgi" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
ファイル選択: <input name="userfile" type="file" size=40><p>
<input type="submit" value="アップロード"> <input type=reset value="クリア">
</form>
</body>
</html>

実はそうでもない場合があるのです。このファイルアップロードに関する挙動などはその典型例の一つだとは思いますが、
ネットスケープ4.X(正確にはネットスケープ4.75を除くネットスケープ4.X)では、日本語のファイル名・パスを使っている場合に、ファイルのアップロードができない場合があります。どういう場合にできないかと言えば、ファイルアップロードのためのファイル選択画面の文字コードが左上のサンプルHTMLのようにEUC-JPで書かれている場合
です。

Shift_JISでHTMLファイルが書かれている場合は問題ありません。ただ、プログラムとの関連でどうしてもEUC-JPで書きたい場合もあるかと思います。もし、他のページは全てEUC-JPなのに、このファイルアップロードのHTMLだけShift_JISにしようと思えば、文字コードの変換処理などが必要になってくる場合が出てくるでしょうし、その場合どうしても煩雑になりがちです。

こういう場合、「※日本語のファイル名やパスを含むファイルのアップロードはできません」みたいな注意書きを全てのユーザーに対して表示するのも、もちろん解決法の一つですが、せっかく圧倒的シェアを持つIEでは、日本語のファイル名もアップロードの対象に出来るのに、これはもったいない話です。そこで、Javacriptでネットスケープ4.Xのみに対して、全角文字を含むファイル名もしくはパスの場合にアップロードできないようにする処理を考えてみます。

(ただし、IEであってもどんな日本語でも適切に処理できるという保証はありませんので、日本語ファイル名は不可という仕様は決して間違いでないとも思います。 。また、アップロードされたファイル名にたとえ日本語が含まれていたとしても、サーバ側ではファイル名を英数字にしておかないと、画像が表示されないなどのトラブルになります。何らかの理由で元ファイル名を保存しておく必要がある場合は、データベースなどに格納するようにしておき、元ファイル名をそのままサーバでも使うのは、得策ではありません。ファイル名の重複の問題などを考えても、そんなことをする人は少ないと思いますが・・・)

右のようなコードになるかと思います。submitボタンがクリックされた場合に、Javascriptによるチェックプログラムが動くようにします。ネットスケープ4.75を除く4.Xにおいて、ファイル名・パス名に2バイト文字が含まれていないかをチェックし、含まれていればフラグを立て、submitできないようにします。もちろん、本当は許可する拡張子のファイルのみをアップロードできるようにJavascriptでチェックするなどの作業もあった方が良いですが(サーバサイドでも、CGIやPHPなどでセキュリティ的な理由から必ずチェックを行ってください)、ここでは割愛しています。また、Windows版IE限定ですが、ファイルサイズがMAX_FILE_SIZEを超えないか、画像ファイルが壊れていないかなどのチェックもあったら便利ですが、ここでは割愛しています。

  (EUC-JPで日本語名のファイルをアップロードできないネットスケープ4.Xの不具合に対応するためのコーディング・サンプル)

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>ファイルのアップロードのテスト</title>
<script language="Javascript">
<!--
   function checkPath(v){
      for(var i=0;i<v.length;i++){
         if(v.charCodeAt(i) > 255){
            //hiddenタグの値にゼロをセットし、submitできないようにする。フラグを立てる
            document.myForm.check.value = 0;
            alert("日本語のファイル名やパスは利用できません");
            return false;
         }
      }
      document.myForm.check.value = 1; //一度エラーになっている場合、元の1をセットしてあげないと永久にsubmitできません。
   }
   function Submit(){
      if(document.myForm.userfile.value == ""){
         alert("送信するファイルを選択してください");
         return false;
      }
      if(document.layers){
      //ネットスケープ4.75はこの不具合がfixされているので対象外
         if(navigator.userAgent.indexOf("4.75") == -1){
            checkPath(document.myForm.userfile.value);
         }
      }
      if(document.myForm.check.value == 1){
         document.myForm.submit();
      }
   }
//-->
</script>
</head>
<body bgcolor=#FFFFFF>
<form enctype="multipart/form-data" action="./upload.cgi" method="post">
<input type=hidden name=check value=1> ←チェック用フラグ
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
Send this file: <input name="userfile" type="file" size=40><p>
<input type="submit" value="アップロード" onClick="Submit();return false;">
&nbsp;<input type=reset value="クリア">
</form>
</body>
</html>


また、前述のように手元のMac版ネットスケープ4.7では、日本語のファイル名は自動的にURLエンコード(Shift_JISコードでのURLエンコード。Mac版ネットスケープ6.1でも、同様にShift_JISでのURLエンコードだった。またWindows版4.X及び6.0でもURLエンコードこそされていないが、Shift_JISでサーバ側に到達していた。IE(Windows版及びMac版とも)及びWindows版ネットスケープ7.02では、EUC-JPであった。)され、問題なくアップロードできました。もしかすると、他のバージョンのMac版ネットスケープ4.Xでは日本語ファイル名をそのままアップロードしようとするかもしれませんが、その場合はJavascriptの2バイト文字チェック関数で引っかかるはずですから、多分これで動くと思います。

ネットスケープ4.7及び6.1では、元ファイル名はShift_JISでURLエンコード(もしくはそのままPOST)されていますから、仮にアップロードされたファイルの元ファイル名などをデータベースに格納しておくのならば、URLデコード後必ずShift_JISからEUC-JPに変換しておく必要があります。ただし、どのブラウザはどの文字コードでファイル名を送信してくるかを場合わけするのは面倒なので、受信したファイル名の文字コードを調べ(PHPならmb_detect_encoding)、対処するのが良いと思います。 最後に、当然のことながら、Javascriptをoffにしているユーザーも3.6%から3.9%ほどいますから(私のサイトの統計。約10万ぐらいのサンプル数で集計)、その場合、チェック関数を通過しませんので、日本語のファイル名でもそのままアップロードされます。場合によっては、ファイルを選択せずに送信してしまうユーザーもいるでしょう。こういうことも考慮してサーバサイドでも必ずチェックすべきです。もちろん、セキュリティ的な観点でもそうです。Javascriptでのチェックは、あくまでも送信ボタンを押して1分近く待たされた挙句、サーバサイドでのチェックで「エラーが発生しました」では、ユーザーがかわいそうだからです。決してサーバサイドでのチェックを省くためではありません。

以上、文字コードによってファイルアップロードができない現象が発生する事例について紹介しました。次のページでは、Googleの検索結果に現れるページタイトルやサマリーが文字化けする事例について取り扱います。