在php中上传多个文件到服务器(一个页面上有多个数组)


Uploading multiple files to server in php (More than one array on a page)

这让我困惑了好几天。我试图上传多个文件到服务器。我正在添加多个文件数组,因为在将文件复制到服务器时,每组文件都在文件名上添加了不同的前缀。

第一个数组上传完美…

<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);
    }
}