【问题标题】:Multi Images Upload Issue多图像上传问题
【发布时间】:2013-10-23 08:09:33
【问题描述】:

我的 HTML 代码是;

<form action="post_photo.php" method="post" enctype="multipart/form-data">
    <tr>
        <td class="trow1" width="10%">Select Image:</td>
        <td class="trow1" width="90%"><input type="file" name="image[]" multiple="multiple" tabindex="1"></td>
    </tr>
    <tr>
        <td class="trow2" align="left">
            <input type="hidden" name="action" value="do_post_photo" />
            <input type="hidden" name="uid" value="{$uid}" />
            <input type="submit" class="button" name="submit" value="Upload Photos" tabindex="2">
        </td>
    </tr>
</form>

我的 post_photo.php 文件有这个代码;

if(isset($_FILES['image']))
{
    foreach($_FILES['image']['tmp_name'] as $key => $tmp_name )
    {
        $file_size = $_FILES['image']['size'][$key];
        $file_tmp = $_FILES['image']['tmp_name'][$key];

        $ext = get_extension($_FILES['image']['name'][$key]);
        $allowed_ext = explode(",","png,gif,jpg,jpeg");
        if(!in_array($ext,$allowed_ext))
        {
            error("Invalid extension.");
        }

        if($file_size > 2097152)
        {
            error("File size must be less than 2 MB.");
        }       
        $file_name = "photo_".TIME_NOW.".".$ext;
        $insert_array = array(
            "uid" => $uid,
            "image" => $file_name,
            "approved" => '1',
            "likes" => '',
            "dateline" => time()
        );

        if(is_dir("uploads/photos/".$file_name)==false)
        {
            move_uploaded_file($file_tmp,"uploads/photos/".$file_name);
        }
        $db->insert_query("photos", $insert_array);
    }
}
redirect("post_photo.php?action=post_photo", "Photos have been posted successfully.");

问题是,如果我选择 4 张图片,它会将 2 张图片上传到 ./uploads/photos/ 文件夹。然而,它在photos sql 表中插入了 4 条记录(这是正确的,因为我选择了 4 张图像)并且所有这些记录也是正确的(我的意思是所有这些记录对于每个正确的图像都有单独的数据)。如果我选择 2 张图片,那么它只会上传一张到 ./uploads/photos/ 文件夹,但是它会在 sql 表中插入 2 条记录。

为什么会出现这个问题?请帮忙!

【问题讨论】:

  • 检查 if(move_uploaded_file (......)) 然后执行sql查询。
  • 我已经把那部分改成了这个; if(is_dir("uploads/photos/".$file_name)==false) { $yes = move_uploaded_file($file_tmp,"uploads/photos/".$file_name); } if($yes) { $db-&gt;insert_query("photos", $insert_array); } 但它仍然上传2张图片并在sql表中插入4条记录。

标签: php mysql image-uploading


【解决方案1】:

把你的 PHP 代码改成这个;

if(isset($_FILES['image']))
{
    $count = 0;
    foreach($_FILES['image']['name'] as $key => $tmp_name)
    {
        $file_size = $_FILES['image']['size'][$key];
        $file_tmp = $_FILES['image']['tmp_name'][$key];

        $ext = get_extension($_FILES['image']['name'][$key]);
        $allowed_ext = explode(",","png,gif,jpg,jpeg");
        if(!in_array($ext,$allowed_ext))
        {
            error("Invalid extension.");
            continue;
        }

        if($file_size > 2097152)
        {
            $size_in_kb = $file_size/1000;
            error("File size must be less than 2MB.");
            continue;
        }

        if(move_uploaded_file($file_tmp,"uploads/photos/".$tmp_name))
        {
            $insert_array = array("uid" => $uid,    "image" => $tmp_name,   "approved" => '1',  "likes" => '',  "dateline" => TIME_NOW);
            $db->insert_query("photos", $insert_array);
            $count++;
        }
    }
}
redirect("post_photo.php?action=post_photo", "Photos have been posted successfully.");

应该可以了!

【讨论】:

    【解决方案2】:

    您说数据库中添加了 4 条记录,只上传了 2 张图片。 问题来了:

        if(is_dir("uploads/photos/".$file_name)==false)
        {
            //1
            move_uploaded_file($file_tmp,"uploads/photos/".$file_name);
        }
        //2
        $db->insert_query("photos", $insert_array);
    

    如您所见,步骤 //2 总是执行,但步骤 //1 仅在此条件为真时执行:"is_dir("uploads/photos/".$file_name)==false"。

    解决方法:在执行sql语句前检查if(move_uploaded_file (......))。

    【讨论】:

    • 我已经把那部分改成了这个; if(is_dir("uploads/photos/".$file_name)==false) { $yes = move_uploaded_file($file_tmp,"uploads/photos/".$file_name); } if($yes) { $db-&gt;insert_query("photos", $insert_array); } 但它仍然上传2张图片并在sql表中插入4条记录。
    • 试试这个:$ok = false; if(is_dir("uploads/photos/".$file_name)==false) { move_uploaded_file($file_tmp,"uploads/photos/".$file_name); $确定=真; } if($ok === true) { $db->insert_query("照片", $insert_array); }
    • 不,它做同样的事情:(
    • 刷新浏览器缓存。它应该工作: $ok = false; if(is_dir("uploads/photos/".$file_name)!==true) { move_uploaded_file($file_tmp,"uploads/photos/".$file_name); $确定=真; } if($ok === true) { $db->insert_query("照片", $insert_array); }
    • Pascut,不是浏览器的缓存问题。它的 PHP 问题。
    猜你喜欢
    • 2013-10-12
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2020-05-13
    相关资源
    最近更新 更多