这让我困惑了好几天。我试图上传多个文件到服务器。我正在添加多个文件数组,因为在将文件复制到服务器时,每组文件都在文件名上添加了不同的前缀。
第一个数组上传完美…
<input name="image[]" type="file" id="image[]" size="30">
<br><input name="image[]" type="file" id="image[]" size="30">
<br><input name="image[]" type="file" id="image[]" size="30">
<br><input name="image[]" type="file" id="image[]" size="30">
<br><input name="image[]" type="file" id="image[]" size="30">
但是当我尝试添加另一个数组时,没有上载任何内容…
<input name="image2[]" type="file" id="image2[]" size="30">
<br><input name="image2[]" type="file" id="image2[]" size="30">
<br><input name="image2[]" type="file" id="image2[]" size="30">
<br><input name="image2[]" type="file" id="image2[]" size="30">
<br><input name="image2[]" type="file" id="image2[]" size="30">
这是处理请求的代码…
//This works for the first array on the page
while(list($key,$value) = each($_FILES[image][name])){ if(!empty($value)) {
$filename = $prefix1.$value;
$add = "../portfolio/gallery/upload/$filename";
copy($_FILES[image][tmp_name][$key], $add);
chmod("$add",0777);
}}
//This does not work for the second array on the page
while(list($key,$value) = each($_FILES[image2][name])){ if(!empty($value)) {
$filename = $prefix2.$value;
$add = "../portfolio/gallery/upload/$filename";
copy($_FILES[image2][tmp_name][$key], $add);
chmod("$add",0777);
}}
你知道我可能做错了什么吗?
谢谢你的帮助!
在复制命令的第二个while循环中访问的是image
键,而不是image2
键。除此之外,您应该在数组键名周围添加引号。
这是一个稍微改进和清理的脚本版本。它仍然有一个很大的缺陷,你信任用户输入,这使得攻击者能够将文件复制到随机位置等。
PHP文档有一个很好的关于PHP文件处理的条目,在那里你可以阅读更多关于move_uploaded_file
和文件安全。
<?php
foreach ($_FILES['image']['name'] AS $key => $filename) {
if(!empty($filename)) {
$add = "../portfolio/gallery/upload/" . $prefix1 . $filename;
move_uploaded_file($_FILES['image']['tmp_name'][$key], $add);
chmod($add, 0777);
}
}
foreach ($_FILES['image2']['name'] AS $key => $filename) {
if (!empty($filename)) {
$add = "../portfolio/gallery/upload/" . $prefix2 . $filename;
move_uploaded_file($_FILES['image2']['tmp_name'][$key], $add);
chmod($add, 0777);
}
}
如果我var_dump($_FILES)我得到了预期的结果,因此您可能在循环中有问题,我试图修改它,其中它是有意义的:
<form action="test2.php" method="post"
enctype="multipart/form-data">
<input name="image[]" type="file" id="image[]" size="30">
<br><input name="image[]" type="file" id="image[]" size="30">
<br><input name="image[]" type="file" id="image[]" size="30">
<br><input name="image[]" type="file" id="image[]" size="30">
<br><input name="image[]" type="file" id="image[]" size="30">
<br><br>
<br><input name="image2[]" type="file" id="image[]" size="30">
<br><input name="image2[]" type="file" id="image[]" size="30">
<br><input name="image2[]" type="file" id="image[]" size="30">
<br><input name="image2[]" type="file" id="image[]" size="30">
<input type='submit'>
</form>
<?php
function move_to_root($name,$tmp, $prefix1, $value)
{
$filename = $prefix1.$name;
$add = "upload/$filename";
move_uploaded_file($tmp, $add);
chmod("$add",0777);
}
if(!empty($_FILES))
{
$prefix = 'ab';//You should know
$value = 'cd';//the same
$nrImages = count($_FILES['image']['name']);
$nrImages2 = count($_FILES['image2']['name']);
for($index=0; $index<=$nrImages; $index++)
{
if(!empty($_FILES['image']['name'][$index]))
move_to_root($_FILES['image']['name'][$index],$_FILES['image']['tmp_name'][$index], $prefix, $value);
}
for($index=0; $index<=$nrImages2; $index++)
{
if(!empty($_FILES['image2']['name'][$index]))
move_to_root($_FILES['image2']['name'][$index],$_FILES['image2']['tmp_name'][$index], $prefix, $value);
}
}