【问题标题】:PHP cannot upload multiple imagesPHP无法上传多张图片
【发布时间】:2012-08-30 11:13:30
【问题描述】:

我有一个表格,我想上传最多五张图片。图片的名称和扩展名应该被插入到数据库表'images'中,然后上传到_uploads/name_of_the_album/目录。

问题是,当我选择一些图片并点击上传时,只有第一张图片正确上传,其他图片失败。

这是我的代码:

if(isset($_FILES['image']) === true){
    $files = $_FILES['image'];

    $allowed_ext = array('jpg', 'jpeg', 'png', 'gif');

    $album_id = (int)$_GET['album_id'];
    $album_name = $_GET['album_name'];

    for($i=0; $i<count($files['name']); $i++){
        $name = $files['name'][$i];
        $tmp_name = $files['tmp_name'][$i];
        $size = $files['size'][$i];

        $ext = explode('.', $files['name'][$i]);
        $ext = strtolower(end($ext));

        $img_name = explode('.', $files['name'][$i]);
        $img_name = strtolower(current($img_name));

                    //do some testing echos to see the result
        //echo $img_name."<br>";

                     //here i'm going to add some validation as soon as
                     // i fix the multi-upload problem

        //insert image into database
        $query_insert_image = "INSERT INTO `images` (album_id, image_name, image_ext) VALUES ({$album_id}, '{$img_name}', '{$ext}') ";
        $insert_image = mysql_query($query_insert_image, $connection) or die(mysql_error());

        if(mysql_affected_rows() == 1){

            move_uploaded_file($tmp_name, '../_uploads/'.$album_name.'/'.$name);
        }

        //redirect
        redirect_to("view_album.php?succeed=1");
    }//end the for loop

    //echo '<pre>',print_r($files, true),'</pre>';
}

下面是表单的一些代码:

<form action="" method="post" enctype="multipart/form-data" name="formUploadImages" id="formUploadImages">
    <p>
        <label for="image">Choose one or more Image(s):</label><br />
        <input type="file" name="image[]" id="image" /><br />
        <input type="file" name="image[]" id="image" /><br />
        <input type="file" name="image[]" id="image" /><br />
        <input type="file" name="image[]" id="image" /><br />
        <input type="file" name="image[]" id="image" />
    </p>
......

任何想法我做错了什么?

【问题讨论】:

  • 只有第一张图片插入数据库并上传到目录,其他我选择不这样做
  • 旁注,切勿在 HTML 文档中多次使用同一个 ID。改用一个类。

标签: php image upload


【解决方案1】:

我认为你是从自己脚下砍树枝。

redirect_to("view_album.php?succeed=1");

重定向意味着刷新页面,这意味着执行结束。在第一个 for 循环结束并上传第一张图片后触发重定向时,for 将不会继续下一次迭代。

当然,解决方法是在 for 循环之后推送该行(并且永远不要期望在重定向之后执行任何操作 - 除非标头已经发送)。

执行redirect_to() 所做的大多数函数(它不是基于另一个函数header() 的核心函数)也确保执行停止(有一行调用header(),另一行调用die()/@987654328 @)。

【讨论】:

  • 非常感谢!!!!!!你是绝对正确的!!!我把函数放在 for 循环之后,它工作得非常好!!!
【解决方案2】:

试试这个 php 代码,为我工作:

for($i=1;$i<6;$i++)
{
if(!empty($_FILES['image_upload'.$i])):
$target = "images/".$_FILES['image_upload'.$i]['name'];
$image_upload.= ",".mysql_real_escape_string(($_FILES['image_upload'.$i]['name']));
move_uploaded_file($_FILES['image_upload'.$i]['tmp_name'], $target);
endif;
}

在你的根目录下创建一个名为“images”的文件夹,所有的图片都会被移动到这个文件夹中。 html 表单可能如下所示:

<form action="" method="post" enctype="multipart/form-data" name="formUploadImages" id="formUploadImages">
<p>
    <label for="image">Choose one or more Image(s):</label><br />
    <input type="file" name="image_upload1" id="image_upload1" /><br />
    <input type="file" name="image_upload2" id="image_upload2" /><br />
    <input type="file" name="image_upload3" id="image_upload3" /><br />
    <input type="file" name="image_upload4" id="image_upload4" /><br />
    <input type="file" name="image_upload5" id="image_upload5" />
</p>

......

此代码在我端运行,根据您的需要进行一些编辑后可能对您有用。 编码愉快!

【讨论】:

  • 感谢您的回复!我已经修好了。就一个问题。我如何验证图像的尺寸?例如检查图像的宽度是否超​​过 150 像素,高度是否超过 100 像素
  • 什么类型的验证?你想让数据库中只允许保存超过 150x100 的图像,否则不是吗?图像类型验证和大小(内存中)验证很容易。
  • 如果你想在维度上使用尺寸验证,请尝试 php 的 getimagesize() 方法。见php.net/manual/en/function.getimagesize.php。希望对你有帮助:)
【解决方案3】:

foreach($_POST['image'] as $report_id){
$sql="INSERT INTO images (album_id, image_name, image_ext) 值 ('{$album_id}', '{$report_id}', '{$ext}') "; $queryExe=mysql_query($sql); }

在“//将图像插入数据库”之后替换此代码。

【讨论】:

  • 如果 ID 是数字,则无需引用。另外你到底在纠正什么?除了引用的 $album_id 之外,我无法区分这两个 sn-ps 代码之间的区别。
【解决方案4】:

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

阅读警告块“自 PHP 5.2.12 起,max_file_uploads 配置...”。也许这就是问题所在。

还有一些很好的例子,也许你应该使用 foreach 而不是 for。

【讨论】:

  • 他为什么要用foreach而不是forforeach 使用它们的 current()/next() 方法迭代数组和对象,而 for 则简单得多,它只是比较和递增。
  • 这只是个人意见。 Foreach 更干净,代码更简单。更容易调试。迭代数组,这就是它创建的原因。但同样,这是我的看法。
  • 它不是为了更简洁的代码而创建的,它是为了允许对非数字索引数组(字典、HashMaps 等)进行迭代而创建的。如果它没有数字索引,您将无法使用for 循环。在 C/C++ 中没有 foreach 循环,但是您可以使用 while 来代替,它非常干净。
  • 但那是桥下的水。我没注意到redirect_to("view_album.php?succeed=1");thingy。
【解决方案5】:

1) 在 web 服务器的根目录下创建一个 .htaccess 文件。

2) 将以下代码放入 .htaccess 文件中并保存。

php_value upload_max_filesize 20M
php_value post_max_size 20M
php_value max_execution_time 200
php_value max_input_time 200

现在您可以使用 html 表单中的文件字段和 PHP 中可用的 move_uploaded_file() 函数以简单的方式上传最大为 20MB 的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2011-09-18
    • 2019-11-13
    相关资源
    最近更新 更多