0

我有一个表格,最多可以上传五张图片。图片的名称和扩展名应该被插入到数据库表'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>
......

任何想法我做错了什么?

4

5 回答 5

3

我认为你正在从自己的脚下砍树枝。

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

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

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

大多数功能redirect_to()(它不是基于另一个功能的核心功能header())也确保执行停止(有一行调用header()和另一行调用die()/ exit())。

于 2012-08-30T11:31:11.753 回答
1

试试这个 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>

……

这段代码在我这边运行,根据您的需要进行一些编辑后可能对您有用。快乐编码!

于 2012-08-30T13:23:37.833 回答
0

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

在 "//insert image into database" 之后替换此代码代替您的代码。

于 2012-08-30T11:27:03.877 回答
0

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

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

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

于 2012-08-30T11:30:58.663 回答
0

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 的文件。

于 2012-08-30T11:31:47.917 回答