我有一个表单,我想在其中最多上传五个图像。图像的名称和扩展名应该插入数据库表"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>
......
你知道我做错了什么吗?
我认为你是在自食其力。
redirect_to("view_album.php?succeed=1");
重定向意味着刷新页面,这意味着执行结束。当在第一个for
循环结束并且上传了第一个图像之后触发该重定向时,for
将不会继续到下一次迭代。
当然,修复方法是在for循环之后推送该行(并且永远不要期望在重定向之后执行任何内容——除非已经发送了头)。
大多数执行redirect_to()
功能的函数(它不是核心函数,它基于另一个函数header()
)也会确保执行停止(有一个调用header()
的行和另一个调用die()
/exit()
的行)。
试试这个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>
这段代码是在我这边运行的,经过一些编辑后,根据您的需要可能会对您有用。编码快乐!
foreach($_POST['image']为$report_id){
$sql="插入images
(album_id、image_name、image_ext)值('{$album_id}'、'{$report_id}'和'{$ext}')";$queryExe=mysql_query($sql);}
将此代码替换为"//将图像插入数据库"之后的代码。
http://php.net/manual/en/features.file-upload.multiple.php
读取警告块"由于PHP 5.2.12,max_file_loads配置…"。也许这就是问题所在。
还有一些很好的例子,也许你应该用foreach而不是for。
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表单中的file字段和PHP中可用的move_uploaded_file()函数,以一种简单的方式上传高达20MB的文件大小。