奇妙な$ _FILESまたは「フォームタイプファイルのフィールドで配列構文を使用する問題」

私は、PHPの$ _FILES配列がなぜ配列されているのか、それともなぜ非常に奇妙な方法で配列されているのかという質問に常に悩まされていました。 フォームフィールド名が配列構文を使用してフォーマットされている場合、$ _REQUEST、$ _GET、または$ _POSTには正しい表現が含まれますが、...この使用は$ _FILESには適していません!



問題


フォームは次のとおりです。

<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="oneLevel[]"> <input type="file" name="oneLevel[]"> <input type="submit"> </form>
      
      





このフォームからファイルをアップロードすると、次のフォームの$ _FILES配列を取得します。

 array( 'files' => array ( 'name' => array ( 0 => 'Lighthouse.jpg', 1 => 'Hydrangeas.jpg', ), 'type' => array ( 0 => 'image/jpeg', 1 => 'image/jpeg', ), 'tmp_name' => array ( 0 => '/tmp/phpQR67Qp', 1 => '/tmp/phpJjnAHA', ), 'error' => array ( 0 => 0, 1 => 0, ), 'size' => array ( 0 => 561276, 1 => 595284, ), ), )
      
      





ほとんどの場合、この「機能」は私には適さず、非論理的なようです。 最も簡単な解決策は、file_0、file_1、...、file_Nなど、ファイルタイプフィールドに単純な(文字列)名を使用することですが、これはあまり便利ではありません。 それでも、この問題の解決に興味がある場合は、続きを読んでください...



解決策


autoprependファイルまたはアプリケーションの初期化時のどこかで、$ _FILE配列を次のように処理する価値があります。

 /** *      * * @param array $arrayForFill   . *     "" *  $_FILES * @param string $currentKey    * @param mixed $currentMixedValue    * @param string $fileDescriptionParam     * (name, type, tmp_name, error  size) * @return void */ function rRestructuringFilesArray(&$arrayForFill, $currentKey, $currentMixedValue, $fileDescriptionParam) { if (is_array($currentMixedValue)) { foreach ($currentMixedValue as $nameKey => $mixedValue) { rRestructuringFilesArray($arrayForFill[$currentKey], $nameKey, $mixedValue, $fileDescriptionParam); } } else { $arrayForFill[$currentKey][$fileDescriptionParam] = $currentMixedValue; } } // ,     "" $_FILES $arrayForFill = array(); //      foreach ($_FILES as $firstNameKey => $arFileDescriptions) { //        , //        foreach ($arFileDescriptions as $fileDescriptionParam => $mixedValue) { rRestructuringFilesArray($arrayForFill, $firstNameKey, $_FILES[$firstNameKey][$fileDescriptionParam], $fileDescriptionParam); } } //  $_FILES   $_FILES = $arrayForFill;
      
      





その結果、より「論理的な」ミシブがあります。

 array( 'files' => array ( 0 => array ( 'name' => 'Lighthouse.jpg', 'type' => 'image/jpeg', 'tmp_name' => '/tmp/phpKNqlsc', 'error' => 0, 'size' => 561276, ), 1 => array ( 'name' => 'Hydrangeas.jpg', 'type' => 'image/jpeg', 'tmp_name' => '/tmp/phpB8X3E8', 'error' => 0, 'size' => 595284, ), ), )
      
      





この決定を公式文書のコメントに投稿しました。 多くの質問がありますが、具体的な例はありません。 ただし、ここでの公開時点ではまだ登場していません(登場するかどうかはわかりません)。



ご清聴ありがとうございました。誰かが役に立つといいのですが。



UPD: 「自動プリペンドファイル内またはアプリケーションの初期化時のどこかで$ _FILE配列を処理する必要がある」という言葉を見て、$ _FILES配列コードを書き換えると、コミュニティの一部でinりが発生したことを宣言します。必要な機能を実装できます。戦闘プロジェクトでこのコードを「そのまま」使用することはお勧めしません。



All Articles