【问题标题】:how to check in php if no file is selected in form如果在表单中没有选择文件,如何签入 php
【发布时间】:2020-10-22 11:31:55
【问题描述】:

我将数据从带有 jquery ajax 的表单发送到 php 文件。 我想检查用户是否至少选择了 1 个文件。 这是我的附件表格的一部分:

<input type="file" class="form-control-file" name="user_attachment[]" multiple="multiple">

我的 jquery ajax:

$.ajax({
    url: "contact.php",
    type: "POST",
    data:  new FormData(this),
    contentType: false,
    cache: false,
    processData:false,
    success: function(data){
        $(".response").html(data);
        $('.spinner').hide();
    },
                
});

如果没有选择文件,则检查 contact.php

$user_attachment_tmp = $_FILES['user_attachment']['tmp_name'];
$user_attachment = $_FILES['user_attachment']['name'];

// several checks if no file is chosen
if( empty($_FILES['user_attachment']['name']) ) {
    echo 'no file chosen'; // fails when nothing is chosen
}

if(!isset($_FILES['user_attachment']) || $_FILES['user_attachment']['error'] == UPLOAD_ERR_NO_FILE) {
    echo 'no file chosen'; // fails when nothing is chosen
}

if(!file_exists($_FILES['user_attachment']['tmp_name']) || !is_uploaded_file($_FILES['user_attachment']['tmp_name'])) {
    echo 'no file chosen'; // fails when nothing is chosen
}

所以问题是:在每种情况下,当没有选择文件时,我都没有收到消息no file chosen

那么如何检查是否没有选择文件(附在表格中)?

【问题讨论】:

    标签: php jquery ajax file


    【解决方案1】:

    由于user_attachment[] 是一个数组,您可以使用count() 函数轻松检查。

    $count = count($_FILES['user_attachment']['name']);
    for ($i = 0; $i < $count; $i++) {
        if (empty($_FILES['user_attachment']['name'][$i])) {
            echo 'no file chosen';
        }
    
        if ($_FILES['user_attachment']['error'][$i] == UPLOAD_ERR_NO_FILE) {
            echo 'no file chosen';
        }
    
        if (!file_exists($_FILES['user_attachment']['tmp_name'][$i]) || !is_uploaded_file($_FILES['user_attachment']['tmp_name'][$i])) {
            echo 'no file chosen';
        }
    }
    

    【讨论】:

    • 只需在控制台中查看并检查$_FILES 数组与var_dump($_FILES) 中的内容。由于您的表单指出 user_attachment 是一个数组,因此您可以在其上使用任何数组函数。假设$_FILES['user_attachment'] 是一个数组。
    • var_dump($_FILES) 给了我这个:array(1) { ["user_attachment"]=&gt; array(5) { ["name"]=&gt; array(1) { [0]=&gt; string(0) "" } ["type"]=&gt; array(1) { [0]=&gt; string(0) "" } ["tmp_name"]=&gt; array(1) { [0]=&gt; string(0) "" } ["error"]=&gt; array(1) { [0]=&gt; int(4) } ["size"]=&gt; array(1) { [0]=&gt; int(0) } } }
    • 更新了答案。原因:文件数组的结构与预期的有点不同。示例:$_FILES['user_attachment']['name'] 包含的条目与上传的文件一样多。如果没有上传的文件有一个错误条目,您可以检查上面的代码。
    【解决方案2】:

    您可以使用$_FILES 数组上的size 字段进行检查,如下所示:

    if ($_FILES['user_attachment']['size'] == 0 && $_FILES['user_attachment']['error'] == 0)
    {
        // user_attachment is empty (and not an error)
    }
    

    (我也在这里检查错误,因为如果出现问题,它可能是 0。我不会为此检查使用名称,因为它可以被覆盖)

    复制自Rudi Visser answer

    【讨论】:

    • 不会工作,因为它是一个多文件上传并且size 以及error 是数组。
    • 嗯,你可以添加 $_FILES['user_attachment']['size'][0]
    猜你喜欢
    • 2020-01-10
    • 2019-02-24
    • 1970-01-01
    • 2015-01-02
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多