We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 15497
    • 117 Posts
    ファイルアップロードについて、いくつか疑問があり、それぞれについて、原因・対処法等ご存知の方がいらっしゃいましたらお願いします。(既出でしたらごめんなさい)

    ■設定状況
    MODx側
     ツール>MODx設定>ファイルマネージャ
     「アップロードサイズの上限」が「1048576」(1MB)
    PHP側
     「upload_max_filesize」が「2M」

    ■ファイルマネージャのアップロードサイズエラーについて

    1MBを越える(2MB未満の)画像をアップロードしようとすると、
    MODx側の設定通りにアップロードできないのですが、
    エラーになっていることがわかりません。

    現象としては、一瞬、何かサブウィンドウのようなものが表示されるのですが、
    本当に何かわからないうちに、一瞬で閉じてしまいます。
    IE6、Firefox2で同様の現象です。

    ちなみに、2MBを越える画像をアップロードしようとすると、
    アラートウィンドウが出て、ちゃんとエラーであることがわかります。
    こちらは、おそらく、PHPからエラーが返ってきているケースかと想像します。

    ■リソースブラウザのアップロードサイズ制限について

    1MBを越える(2MB未満の)画像をアップロードすると、
    画像自体はアップロードできてしまいます。
    が、サムネイルが生成されません。

    リソースブラウザのアップロードサイズを制限することはできますでしょうか?
    また、なぜサムネイルが生成されないのでしょうか?

    ちなみに、2MBを越える画像の場合は、ファイルマネージャと同様です。

    ■ファイル名に全角文字を使った場合

    以下のような問題があり、
    現状、全角文字が入ったファイル名のものは使ってはいけないと思いますが、
    様々なユーザが使うので、システム側でエラーにして欲しいのですが、
    何か良い手は無いでしょうか?

    以下、リソースブラウザで試した結果です。

    ○全角文字ばかりを使ったファイル名
    →画像選択ウィンドウに表示されない
     (実際は、全角文字が削除され、拡張子だけになり「.GIF」等でアップされている)

    ○先頭が全角文字で、途中から半角文字になるファイル名
    →全角文字が削除され、半角文字だけのファイル名でアップされる。

    ○先頭が半角文字で、途中から全角文字になるファイル名
    →画像選択ウィンドウに何も表示されなくなる。
     元々あった正常なファイル名のものも表示されなくなってしまう。
     (実際は、UTF8のファイル名でアップされているが、画像選択ウィンドウが非対応な感じ)
      ★日本公式フォーラム2009年9月1日本格始動!★
      http://modxcms-jp.com/bb/

      ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
      http://d.hatena.ne.jp/hikidas_ikeda/
      ▼制作済みHTMLページをmodxで更新するデモ
      http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
      • 28073
      • 164 Posts
      soushiです。

      とりあえずわかるところのみ。。。
      すいません検証の時間がとれなかったので、検証はできてません :’(

      Quote from: kazuike at Sep 03, 2008, 02:52 AM

      ■リソースブラウザのアップロードサイズ制限について

      1MBを越える(2MB未満の)画像をアップロードすると、
      画像自体はアップロードできてしまいます。
      が、サムネイルが生成されません。

      リソースブラウザのアップロードサイズを制限することはできますでしょうか?
      また、なぜサムネイルが生成されないのでしょうか?

      リソースブラウザのアップロードファイルの容量制限をどこでやってるのか調べてみました(MODx0961p2)。

      /manager/media/browser/mcpuk/connectors/php/Commands/FileUpload.php(69行目付近)
                              if (array_key_exists("NewFile",$_FILES)) {
                                      if ($_FILES['NewFile']['size']<($typeconfig['MaxSize']*1024)) {
      
                                              $filename=basename(str_replace("\\","/",$_FILES['NewFile']['name']));
      


      この$typeconfig[’MaxSize’]に1024をかけた値とアップロードしたファイルのサイズを比較しています。
      そして$typeconfig[’MaxSize’]を追っかけるとMODx設定の「アップロードサイズの上限」の値が入っているようですが、「アップロードサイズの上限」はバイト単位だと思うので、1024をかける必要はないような気がします。
      …んーバグ? :’(
      もし可能でしたら1024の掛け算を削ってみてはいかがでしょうか。

      Quote from: kazuike at Sep 03, 2008, 02:52 AM

      ■ファイル名に全角文字を使った場合

      以下のような問題があり、
      現状、全角文字が入ったファイル名のものは使ってはいけないと思いますが、
      様々なユーザが使うので、システム側でエラーにして欲しいのですが、
      何か良い手は無いでしょうか?

      アップロードしたファイル名はここで決めているようです。

      /manager/media/browser/mcpuk/connectors/php/Commands/FileUpload.php(70行目付近)
                                      if ($_FILES['NewFile']['size']<($typeconfig['MaxSize']*1024)) {
      
                                              $filename=basename(str_replace("\\","/",$_FILES['NewFile']['name']));
      
                                              $lastdot=strrpos($filename,".");
      


      ファイル容量確認の直後に$filenameを決定しています。
      手っ取り早く修正するならこんな感じでしょうか。

      /manager/media/browser/mcpuk/connectors/php/Commands/FileUpload.php(70行目付近)
                                      if ($_FILES['NewFile']['size']<($typeconfig['MaxSize']*1024)) {
      
                                              $filename=basename(str_replace("\\","/",$_FILES['NewFile']['name']));
      
                                             //***追加分***
                                              $lastdot=strrpos($filename,".");
      
                                             if(! preg_match('/^[a-zA-Z0-9\._\-]+$/',$filename)){
                                                      $lastdot = false;
                                              }
                                             //***追加分***
      


      ファイル名に半角英数と「._-」以外の文字を発見したら$lastdotをfalseにして次の処理で強制的にエラーにします。
        • 15497
        • 117 Posts
        soushiさん、ありがとうございます。

        ■リソースブラウザのアップロードサイズ制限について

        /manager/media/browser/mcpuk/connectors/php/Commands/FileUpload.php(69行目付近)
        この$typeconfig[’MaxSize’]に1024をかけた値とアップロードしたファイルのサイズを比較しています。
        そして$typeconfig[’MaxSize’]を追っかけるとMODx設定の「アップロードサイズの上限」の値が入っているようですが、「アップロードサイズの上限」はバイト単位だと思うので、1024をかける必要はないような気がします。
        …んーバグ? Cry
        もし可能でしたら1024の掛け算を削ってみてはいかがでしょうか。
        「*1024」を削ってみました。
        結果、期待通り、1MBを越える画像はエラーとなりました。 laugh
        (もちろん、1MB未満の画像はちゃんとアップできます。)
        やっぱり、バグ(仕様の勘違い?)なんじゃないでしょうか?

        ■ファイル名に全角文字を使った場合

        /manager/media/browser/mcpuk/connectors/php/Commands/FileUpload.php(70行目付近)
        ファイル名に半角英数と「._-」以外の文字を発見したら$lastdotをfalseにして次の処理で強制的にエラーにします。
        if(! preg_match('/^[a-zA-Z0-9\._\-]+$/',$filename)){
            $lastdot = false;
        }
        

        残念ながら、ファイル名に全角文字が入っていても素通りでした。 sad
        というか、ここに来た時点で、既に全角文字は消されていました。

        ここに来る前に、どこかでファイル名の正規化?のようなことが行なわれているようです。
          ★日本公式フォーラム2009年9月1日本格始動!★
          http://modxcms-jp.com/bb/

          ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
          http://d.hatena.ne.jp/hikidas_ikeda/
          ▼制作済みHTMLページをmodxで更新するデモ
          http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
          • 15497
          • 117 Posts
          その後、残念ながらというか、予想通りというか、
          全角文字を含むファイルをお客様がアップするという事態が、度々起こってきました。
          必要に迫られ、なんとかエラーにしてはじくところまでは、たどり着きましたので、ご報告します。

          ●全角文字が削除される原因
          PHPの「basename」にバグがあったようです。
          http://blog.jojo.jp/?eid=632412
          http://bugs.php.net/bug.php?id=37738
          どうも、PHPのバージョン5.2.2より以前のバージョンでは、basenameやpathinfoは、日本語などのマルチバイト文字を扱えないようです。
          #そういえば、今まで、basenameはよく使っていましたが、マルチバイト文字のファイル名を扱うという経験はなかった…

          ●全角文字等が入っているファイル名をエラーにする方法
          リソースブラウザのアップロード処理
          「manager/media/browser/mcpuk/connectors/php/Commands/FileUpload.php」
          を直接変更します。

          まず、72行目の「basename」を置き換えます。
          $filename=basename(str_replace("\\","/",$_FILES['NewFile']['name']));

           ↓ 以下のように変更します。
          $filename=end(explode('/',str_replace("\\","/",$_FILES['NewFile']['name'])));


          その直後に、以下のように、文字種の判定を挿入します。
          if(preg_match('|^[a-zA-Z0-9\._\-\\/]+$|', $filename)){


          元の186~189行目の「Unable to determine…」のエラーメッセージをセットしている箇所と、
          元の191~194行目の「This file exceeds…」のエラーメッセージをセットしている箇所の間に、
          以下のように、新たに、ファイル名に対するエラーメッセージをセットするコードを挿入します。
          } else {
              $disp="202,'Disallowed file name.'";
          }
          

          結果、このあたりのソースコードは、以下のようになります。
                  } else {
                      //No file extension to check
                      $disp="202,'Unable to determine file type of file'";
                  }
              } else {
                  $disp="202,'Disallowed file name.'";
              }
          } else {
              //Too big
              $disp="202,'This file exceeds the maximum upload size.'";
          }
          

          #私は、ついでに日本語のエラーメッセージを入れちゃったりしていますが…
          #(日本語を入れるときは、UTF-8で保存する必要があります。元のファイルはASCIIなので)

          ついでに、70行目のファイルサイズチェックのバグも直しておきましょう。
          if ($_FILES['NewFile']['size']<($typeconfig['MaxSize']*1024)) {

           ↓ 以下のように変更(「*1024」を削除)します。
          if ($_FILES['NewFile']['size']<($typeconfig['MaxSize'])) {


          2009-03-24追記)
          さらに改良したソースを下記にアップしました。
          http://modxcms.com/forums/index.php/topic,34199.0.html
            ★日本公式フォーラム2009年9月1日本格始動!★
            http://modxcms-jp.com/bb/

            ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
            http://d.hatena.ne.jp/hikidas_ikeda/
            ▼制作済みHTMLページをmodxで更新するデモ
            http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php