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

在php中将多个文件上载到服务器(一个页面上有多个数组),php,arrays,file-upload,Php,Arrays,File Upload,这让我难堪了好几天。我正在尝试将多个文件上载到服务器。我正在添加多个文件数组,因为在将每组文件复制到服务器时,会向文件名添加不同的前缀 第一个阵列可以完美上传 <input name="image[]" type="file" id="image[]" size="30"> <br><input name="image[]" type="file" id="image[]" size="30"> <br><input name="image[

这让我难堪了好几天。我正在尝试将多个文件上载到服务器。我正在添加多个文件数组,因为在将每组文件复制到服务器时,会向文件名添加不同的前缀

第一个阵列可以完美上传

<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">
你知道我做错了什么吗

谢谢你的帮助

在copy命令的第二个while循环中,您访问的是图像键而不是image2键。此外,还应在数组键名称周围添加引号

这里是您的脚本的一个稍微改进和清理的版本。它仍然有一个很大的缺陷,即您信任用户输入,这使得攻击者能够将文件复制到随机位置等

在这里,您可以阅读有关移动文件和文件安全的更多信息

<?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$_文件,我会得到预期的结果,因此您可能会在那里的循环中遇到问题,我尝试对其进行修改,其意义如下:

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

您丢失了一些引用…抱歉,忘记提及这是我在尝试上载第二组文件时收到的错误。。。警告:copy[function.copy]:在MMM中文件名不能为空,请用什么引号?也许我一直都在用很长的时间来观察它。你可以在图像数组中添加另一个维度,看看这是否会有所不同。image[1][]和image[2][]我承认我以前没有使用过多维数组。像这样的?我更正了image2键,但它仍然不起作用。复制$\u文件[image2][tmp\u名称][$key],$add;请更具体地说明它不起作用。错误是什么?您是否检查了php错误日志?是否检查了upload_errors值?可能是上载有问题。我收到以下错误:警告:传递给每个的变量不是。。。。为什么它不被看作一个数组?这很奇怪,因为第一个数组被识别,文件被复制到服务器,但第二个数组不被识别。请用当前代码更新你的第一篇文章。我已经测试过了,效果很好:原来的文章有很大的错误,对不起,我不知道我做错了什么。我正在使用你的代码,它只上传第一组图像。我不知道,你检查过最大上传大小吗?放一个回音;并检查错误
<?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);   
    }
}
<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);
    }
}