2

次のような複数のファイルを選択するファイル入力があります。

<input type = 'file' name = 'file[]' id = 'file' class = 'file' multiple = 'multiple' />

ユーザーがファイル (またはファイル) を選択すると、Javascript を使用して ID とクラスを「oldFile」に更新し、別のファイル入力を先頭に追加しますが、file[] ではなく file2[] を使用します。これは、ユーザーがファイルを選択し続ける限り発生します。次に、ユーザーがフォームを送信すると、ファイルが PHP スクリプトに送信されます。以下に示すように、ファイルをカウントする 2 つの方法を試しました。

最初はシンプルです

$files = count($_FILES);

2つ目は

$f = 0;
foreach($_FILES as $b)
{
    $f++;
}
$files = $f;

ただし、特定の順序でファイルを選択すると、正しくないカウントが返されます。

2 つのファイル、次に 1 つのファイル、次に 2 つのファイルを選択してフォームを送信すると、4 つのファイルを送信したと表示されます。

2 つのファイルを選択してから 1 つのファイルを選択すると、正しく 3 つのファイルと表示されます。

問題が何であるかについて何か考えはありますか (意味があるかどうかわかりません)?

4

1 に答える 1

8

配列ベースのファイル アップロード名をそのまま使用すると、PHP の $_FILES が少し不安定になります。その場合に作成される構造は、実際には

$_FILES = array(
   'name' => array(
      0 => 'name of first file'
      1= > 'name of second file'
      etc...
   'type' => array(
      0 => 'type of first file',
      1 => 'type of second file'
   etc..
);

つまり、アップロード内で追跡されるフィールドの数に一致する一定のカウント ($_FILES) が取得されます。アップロードされたファイルの数を正確にカウントするには、サブキーの 1 つをカウントする必要があります。

count($_FILES['name']);

なぜこのようにしたのか、私に聞かないでください。PHP の設計はすでに十分にばかげており、これはその根本的な愚かさを証明する多くの例の 1 つにすぎません。

より賢明な/正気のデザイナーが使用したであろう

$_FILES = array(
   0 => array(... all data about file #1),
   1 => array('... all data about file #2),
   etc...
)
于 2012-09-10T04:23:49.103 に答える