处理输入=“文件”数组

时间:2017-09-15 19:05:12

标签: php html

我有一个像这样的html表单:

<form method="post" enctype="multipart/form-data">
    <input type="file" name="pictures[]" required>
    <input type="file" name="pictures[]">
    <input type="file" name="pictures[]">
    <input type="file" name="pictures[]">
    <input type="file" name="pictures[]">
</form>

这样,用户最多可以上传5张图片。我知道我可以用<input type="file" name="pictures[]" multiple>来做,但我的想法是,我希望用户能够从他们设备的不同文件夹中选择文件,因此我之所以用以上格式编写的原因

现在,我现在遇到的挑战是,并非所有输入都是必需的,并且在提交表单时,我执行正常的输入检查$_FILES['pictures']['name],它会循环遍历所有文件数组,是正常的,因为它们具有相同的名称。

现在我头疼..

  • 如何在维护必填字段时仅验证输入文件的输入?

现在,如果我在输入框中添加的文件少于5个时进行检查$_FILES['pictures']['name'],则由于未输入的输入字段而返回错误。

修改

首先我检查是否输入了至少一个文件,然后检查是否有任何文件没有返回任何错误。请参阅下面的代码:

if ( count($_FILES['pictures']['name']) < 1 ) {
    echo "Please enter at least one image";
}
elseif ( $_FILES['pictures']['error'] != 0 ) {
    echo "Sorry, one or more of your uploaded images is invalid";
}

如果未输入所有5个输入字段,表单将始终返回错误。

另一个编辑

也许我无法清楚地解释我想要实现的目标......但这是要点。

除了需要其中一个输入之外,当提交表单时没有输入所有字段,我做了类似(跳过所需的支票)

$files = array();
$fileData = $_FILES['pictures'];
$files = array();
if ( is_array($fileData['name']) ) {

    for ( $i=0; $i < count($fileData['name']) ; ++$i ) {
        $files[] = array(
            'name' => $fileData['name'][$i],
            'tmp_name' => $fileData['tmp_name'][$i],
            'type' => $fileData['type'][$i],
            'error' => $fileData['error'][$i],
            'size' => $fileData['size'][$i],
        );        
    }
}
else {
    $files[] = $fileData;
}

因此,当我执行以下验证时:

foreach ($files as $file) {
    if ( $file['name'] == '' ) {
        echo "Error";
    }
}

,并且用户未输入所有图像,则返回错误消息。

print_r()的{​​{1}}会返回此信息:

$files

有没有办法在进行检查时让空字段被忽略?

我知道我可以通过检查空字段并在提交时添加Array ( [photos] => Array ( [name] => Array ( [0] => 11356010_127900540886840_1152019271_n.jpg [1] => 11370980_130679033939470_1067474802_n.jpg [2] => [3] => [4] => ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg [2] => [3] => [4] => ) [tmp_name] => Array ( [0] => C:\xampp7\tmp\php1C9F.tmp [1] => C:\xampp7\tmp\php1CaF.tmp [2] => [3] => [4] => ) [error] => Array ( [0] => 0 [1] => 0 [2] => 4 [3] => 4 [4] => 4 ) [size] => Array ( [0] => 108492 [1] => 108492 [2] => 0 [3] => 0 [4] => 0 ) ) [files] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) ) 的属性来使用javascript执行此操作,但是如果用户在他/她的浏览器中关闭了javascript,会发生什么?

我尝试过像这样使用disabled

array_filter()

,但它返回一个空数组。有人可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

$_FILES['pictures']['error']最终将成为一个错误代码数组,因此您可以循环显示它并明确处理它们。有good example of this in the PHP documentation

在您的情况下,您可能希望将循环的第一次迭代作为特殊情况处理,因为您已将第一次迭代定义为必需。像这样:

foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($key == 0 && $error != UPLOAD_ERR_OK) {
        // the required one didn't succeed, so we have a problem
    } else {
        // ...

答案 1 :(得分:0)

因为它是一个数组使用in_array()http://php.net/manual/en/function.in-array.php

<label style="font-size:16px;">
    <input style="height:1em; width:1em;" type="radio">
    <span>Button One</span>
</label>