PHP - 多文件上传,如果没有上传某些字段,则会出错

时间:2016-12-11 03:38:44

标签: php gd

您好我上传了多个文件的PHP,但我的表单不需要上传所有字段(只需要至少一个字段上传),因此用户可能无法上传第二个输入字段。

问题是如果用户只上传了1个文件,用户将收到错误“无效文件”(final else statement)。 但是如果用户上传所有2个字段,它没有错误,我猜错误来自null upload字段。所以我先使用if if empty,但它不起作用。我该怎么办?

<form action="upload.php"  method="post" enctype="multipart/form-data">         
            Image 1 :
                <input type="file" name="images[]" />
                <br>   
            image 2 :
                <input type="file" name="images[]" />  <br>

                <input type="submit" value="Upload" />
</form>

在upload.php页面

if(!empty($_FILES))
{
      $count = count($_FILES["images"]["name"]);

    for($i=1; $i <= $count; $i++)
    {   
        if ((($_FILES["images"]["type"][$i-1] == "image/gif")
             || ($_FILES["images"]["type"][$i-1]  == "image/jpeg")
            || ($_FILES["images"]["type"][$i-1]  == "image/png"))
            && ($_FILES["images"]["size"][$i-1] < 2000000)) //2 MB
        {

             if ($_FILES["images"]["error"][$i-1]  > 0)
             {
                 echo "File Error : " . $_FILES["images"]["error"][$i]  . "<br />";
             }
             else 
             {
                if (file_exists("path/to/".$_FILES["images"]["name"][$i-1] ))
                {
                   echo "<b>".$_FILES["images"]["name"][$i-1]  . " already exists. </b>";
                }
                else
                {
                   $newname = date('Y-m-d')."_".$i.".jpg";
                   move_uploaded_file($_FILES["images"]["tmp_name"][$i-1] , "path/to/".$newname);

                 }
               }
             }
                else
                {
                   echo "Invalid file" ;
                   exit();
                } 
          }
       } 

1 个答案:

答案 0 :(得分:2)

您可以将第一行更改为:

if(isset($_FILES["images"]["name"][0])) {

使用一个或多个文件可以使用

在线:

echo "Invalid file" ;
exit();

这可能是一个问题,因为如果第一个文件出现问题,则退出应用程序而不处理第二个或其他文件。

我也建议您使用此代码:

<?php 
if (isset($_FILES["images"]["name"][0])) {
$path_upload = 'path/upload/';
$count = count($_FILES["images"]["name"]);
$allowed_types = array("image/gif", "image/jpeg", "image/png");
$nl = PHP_EOL.'<br>'; // Linux: \n<br> Window: \r\n<br>

for($i=0; $i < $count; $i++)
{   
    $file_type = $_FILES["images"]['type'][$i];
    $file_name = $_FILES["images"]['name'][$i];
    $file_size = $_FILES["images"]['size'][$i];
    $file_error = $_FILES["images"]['error'][$i];
    $file_tmp = $_FILES["images"]['tmp_name'][$i];

    if (in_array($file_type, $allowed_types) && $file_size < 2000000) {

        if ($file_error > 0) {

            echo 'Upload file:'.$file_name.' error: '.$file_error.$nl;

        } else {

            $path_new_upload = $path_upload.$file_name;

            // verify while filename exists
            while (file_exists($path_new_upload)) {

                $ext = explode('.', $file_name); // explode dots on filename
                $ext = end($ext); // get last item of array
                $newname = date('Y-m-d_').$i.'.'.$ext;

                $path_new_upload = $path_upload.$newname;

            }

            move_uploaded_file($file_tmp, $path_new_upload);

        }


    } else {

        echo 'Invalid file type to: '.$file_name.$nl;
        // continue the code
    }
}

}

可以更好,这个验证文件名到新创建。