2012-09-10 122 views
1

我有一个选择多个文件,看起来像这样一个文件输入:

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

当用户选择一个文件(或文件),使用Javascript我更新的ID和类“ oldFile',然后添加另一个文件输入,但使用file2 []而不是file []。只要用户不断选取文件,就会发生这种情况。然后,当用户提交表单时,这些文件会发送到我的PHP脚本中。我已经尝试了两种计算文件的方法,如下所示。

首先是一个简单的

$files = count($_FILES); 

二是

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

然而,当我按照一定的顺序选择的文件,它会返回一个不正确的计数。

如果我选择两个文件,然后一个文件,然后两个文件并提交表格,它说我提交了4个文件。

如果我选择两个文件,然后选择一个文件,它正确地说3个文件。

任何想法可能是什么问题(不知道我是否有意义)?

+0

是什么,当你vardump()$ _FILES说的? sizeof($ _ FILES)? – noko

+0

文件是否真的提交?这看起来像一个JS问题。我会建议分享JS代码。 –

回答

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)相匹配的上传中跟踪字段的数量。要准确计数已上传的文件数量,您需要计算其中一个子密钥,例如。

count($_FILES['name']); 

不要问我为什么这样做。 PHP的设计已经足够愚蠢,而这只是证明其基础愚蠢的众多例子之一。

一个更明智/明智的设计师会用

$_FILES = array(
    0 => array(... all data about file #1), 
    1 => array('... all data about file #2), 
    etc... 
) 
+0

我将如何获得最后一个文件输入的名称?我不需要做count($ _ FILES ['file'] ['name'])+ count($ _ FILES ['file2'] ['name'])等等...直到最后一个文件输入或上午我误解你了? – Lukas

+0

如果您在上传中混合基于数组的名称[name]和非数组名'otherstuff',则所有投注都将关闭。做一个'var_dump($ _ POST)'并分析你看到的结构。那会告诉你如何/你需要计数。 –

+0

它实际上是$ _FILES - >文件(2,3等) - >名称 - > 0。我通过在文件信息的窗体中使用隐藏的输入来解决它。 – Lukas