【问题标题】:$_FILES array is not empty upon uploading nothing$_FILES 数组在不上传任何内容时不为空
【发布时间】:2012-09-14 08:37:50
【问题描述】:

这是表格

form action="index.php" method="POST" enctype="multipart/form-data" >
        <input type="file" name="image[]" multiple="multiple">
        <input type="submit" value="upload">
    </form> 

我试图仅在 if(!empty($_FILES['image'])){ 时才运行我的代码,但由于某种原因,在不提交任何文件且仅单击提交时数组不为空。

如果有帮助,这里是其余代码,谢谢。

<html>

图片上传

    <form action="index.php" method="POST" enctype="multipart/form-data" >
        <input type="file" name="image[]" multiple="multiple">
        <input type="submit" value="upload">
    </form> 

    <?php

    include 'connect.php';

    if(!empty($_FILES['image'])){
    echo $_FILES['image']['error'];
        $allowed = array('jpg', 'gif', 'png', 'jpeg');
        $count = 0;

        foreach($_FILES['image']['name'] as $key => $name){
        $image_name = $name;
        $tmp = explode('.', $image_name);
        $image_extn = strtolower(end($tmp)); //can only reference file
        $image_temp = $_FILES['image']['tmp_name'][$count];
        $filesize = filesize($_FILES['image']['tmp_name'][$count]);
        $count = $count +1;

        if(count($_FILES['image']['tmp_name']) > 5){
            echo "You can upload a maximum of five files.";
            break;
        }

        else if(in_array($image_extn, $allowed) === false){
            echo $name." is not an allowed file type<p></p>";
        }

        else if($filesize > 1024*1024*0.3){
            echo $name." is too big, can be a maximum of 3MB";
        }

        else{

            $image_path = 'images/' . substr(md5($name), 0, 10) . '.' . $image_extn;


            move_uploaded_file($image_temp, $image_path);

            mysql_query("INSERT INTO store VALUES ('', '$image_name', '$image_path')") or die(mysql_error());

            $lastid = mysql_insert_id();
            $image_link = mysql_query("SELECT * FROM store WHERE id = $lastid");
            $image_link = mysql_fetch_assoc($image_link);
            $image_link = $image_link['image'];
            echo "Image uploaded.<p></p> Your image: <p></p><a href = $image_link>$image_path</a>";
            }

        }
        }

    else{
            echo "Please select an image.";
        }

    ?>

【问题讨论】:

  • 我认为它永远不会是空的,因为它包含上传的所有数据。例如,它会告诉你文件大小是0。它将是某种字符串 - 使用 print_r($_FILES) 检查数组并查看要使用什么来检查图像是否未上传。
  • 尝试执行 var_dump($_FILES) 并查看内容...
  • array is not empty 是什么意思?它不应该为空
  • 这个文件是否命名为 index.php?

标签: php file upload


【解决方案1】:

这是$_FILES数组在没有上传任何内容时的样子

Array ( [image] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) )

所以它永远不会是空的。

错误码 4 [error] =&gt; 4 表示没有上传文件,错误码code 0 表示没有错误,文件已经上传,您可以查看

if($_FILES['image']['error']==0) {
    // file uploaded, process code here
}

这里是another answer

【讨论】:

  • 你可以得到不同的错误,我也看到UPLOAD_ERR_PARTIAL(3)在UPLOAD_ERR_NO_FILE(4)旁边。
【解决方案2】:

改用is_uploaded_file PHP 函数:

if(is_uploaded_file($_FILES['image']['tmp_name'])) {
  //code here
}

http://php.net/manual/en/function.is-uploaded-file.php

【讨论】:

  • 当我把它放在if(!empty($_FILES['image'])){ 下并将它用作if(is_uploaded_file($_FILES['image']['tmp_name'][$count])) { 时,这有效。
  • 嗯,还有一千种不同的事情你也可以做,但这并不意味着它实际上是正确的做法,也不意味着你明白你在做什么。您需要检查错误代码,另请参阅:php.net/manual/en/features.file-upload.errors.php - 这对于您在此处使用的 $count 变得尤为重要,因为您应该更好地了解您正在使用哪种数据。请参阅:php.net/manual/en/features.file-upload.post-method.php(上传文件数组)
  • 这种方式效果很好。我对原始代码的唯一问题是,当我提交了一个空白表单时,此代码:` else if(in_array($image_extn, $allowed) === false){ echo $name." is not an allowed file type

    "; }` 仍然会运行。
  • 是的,当然。它一直有效,直到它破裂。问题是你是否能够真正理解为什么某事有效,为什么不有效。我只能尽力帮助你理解。我添加了一个答案,向您展示 what 实际发生的情况,也许它可以帮助您澄清事情:stackoverflow.com/a/12538983/367456
  • 我明白现在发生了什么。我只是检查if(!empty($_FILES['image'])){ 以确保设置了涉及'$_FILES['image']' 数组的其余代码,否则提交的空表单将返回一个数组,这将使if(in_array($image_extn, $allowed) === false){ 执行。
【解决方案3】:

你应该首先看看 PHP 手册,因为 - 你不是第一个遇到这个问题的人 - 解决方案已经写好了in there

如果您的表单中没有选择上传文件,PHP 将返回 $_FILES['userfile']['size'] 为 0,$_FILES['userfile']['tmp_name'] 为无。

所以如果你真的想知道image元素的任何文件是否已经提交,检查它:

 $noFile = $_FILES['image']['size'][0] === 0 
           && $_FILES['image']['tmp_name'][0] === '';

是的,就是这么简单。

你使用的测试:

empty($_FILE);

只会告诉您整个表单是否已提交。所以一个完整的例子:

$submitted = empty($_FILE);
if ($submitted) {
    $noFile    = $_FILES['image']['size'][0] === 0 
                 && $_FILES['image']['tmp_name'][0] === '';
    if ($noFile) {
        ...
    }
}

【讨论】:

  • 使用if(is_uploaded_file($_FILES['image']['tmp_name'])) 可以节省几个字节,从而加快页面加载速度……哈哈。
  • 旁注:可能没有错误,但文件大小为 0 字节。这是上传表单的重播,没有实际上传任何文件数据。浏览器可能会发生,我在 Chromium 上见过。
【解决方案4】:

校验值不为空:

in_array(!null,$_FILES['field_name']['name'])

【讨论】:

    【解决方案5】:
    if($_FILES['image']['error'] === UPLOAD_ERR_OK) {
        // Success code Goes here .. 
    }
    

    UPLOAD_ERR_OK如果没有错误返回值0,文件上传成功。

    【讨论】:

      【解决方案6】:

      http://php.net/manual/en/features.file-upload.post-method.php

      如果您的表单中没有选择上传文件,PHP 将返回 $_FILES['userfile']['size'] 为 0,$_FILES['userfile']['tmp_name'] 没有。

      即使用户没有选择要上传的文件,您也会在每个“文件”上传字段中获得一个数组条目。

      【讨论】:

        【解决方案7】:

        我遇到了多文件输入的问题。 我发现用于检查是否已选择任何文件的工作是:

        <?php
        $size_sum = array_sum($_FILES['img']['size']);
        if ($size_sum > 0) {
         // at least one file has been uploaded
        } else {
         // no file has been uploaded
        }
        ?>
        

        【讨论】:

          【解决方案8】:
          if(!empty($_FILES['image']['name'][0]) || !empty($_FILES['image']['name'][1]) ||  
          !empty($_FILES['image']['name'][2]))
          

          for($1=0;$i<count($_FILES['image']);$i++){
          if(!empty($_FILES['image']['name'][$i])){
             // do something
          }
          }
          

          【讨论】:

            【解决方案9】:
            if(isset($_FILES['file'])){//do some thing here}
            

            【讨论】:

            • 此代码与其他 6 个答案有何不同?它的目标是什么?请在你的回答中解释。
            • 我只是分享了简单易懂的代码。我分享给初学者
            • 你应该添加一个解释:这段代码应该如何使用?
            猜你喜欢
            • 2015-01-01
            • 1970-01-01
            • 2015-08-22
            • 2016-10-15
            • 2014-08-23
            • 1970-01-01
            • 2015-02-04
            • 1970-01-01
            • 2017-03-29
            相关资源
            最近更新 更多