Php 将文件放入正确文件夹的问题

Php 将文件放入正确文件夹的问题,php,arrays,file-upload,Php,Arrays,File Upload,我还有一个问题要问: 我正试图根据扩展名将文件放入不同的文件夹中。但是,无论打印时数组显示什么,这些文件最终都位于具有相同文件名的同一文件夹中 这是我目前拥有的阵列: $files[$key] = array ( $file_name = basename($guid." - ".$_FILES['file']['name'][$key]), $file_type = $_FILES['file']['type'][$key], $file_size = $_FILES[

我还有一个问题要问:

我正试图根据扩展名将文件放入不同的文件夹中。但是,无论打印时数组显示什么,这些文件最终都位于具有相同文件名的同一文件夹中

这是我目前拥有的阵列:

$files[$key] = array
(
    $file_name = basename($guid." - ".$_FILES['file']['name'][$key]),
    $file_type = $_FILES['file']['type'][$key],
    $file_size = $_FILES['file']['size'][$key],
    $file_tmp = $_FILES['file']['tmp_name'][$key],
    $extension = strtolower(substr($file_name, strlen($file_name)-4, strlen($file_name))),
    $tgt = $_FILES['file']['name'][$key]
);
Array
(
[0] => Array
    (
        [0] => 966c5853-63b4-4570-a3ee-bd5629688038 - cycles.pdf
        [1] => application/pdf
        [2] => 331881
        [3] => C:\xampp\tmp\php9738.tmp
        [4] => .pdf
        [5] => cycles.pdf
    )

[1] => Array
    (
        [0] => 966c5853-63b4-4570-a3ee-bd5629688038 - landofstoopid.bmp
        [1] => image/bmp
        [2] => 310342
        [3] => C:\xampp\tmp\php9758.tmp
        [4] => .bmp
        [5] => landofstoopid.bmp
    )
这是我目前的阵列输出:

$files[$key] = array
(
    $file_name = basename($guid." - ".$_FILES['file']['name'][$key]),
    $file_type = $_FILES['file']['type'][$key],
    $file_size = $_FILES['file']['size'][$key],
    $file_tmp = $_FILES['file']['tmp_name'][$key],
    $extension = strtolower(substr($file_name, strlen($file_name)-4, strlen($file_name))),
    $tgt = $_FILES['file']['name'][$key]
);
Array
(
[0] => Array
    (
        [0] => 966c5853-63b4-4570-a3ee-bd5629688038 - cycles.pdf
        [1] => application/pdf
        [2] => 331881
        [3] => C:\xampp\tmp\php9738.tmp
        [4] => .pdf
        [5] => cycles.pdf
    )

[1] => Array
    (
        [0] => 966c5853-63b4-4570-a3ee-bd5629688038 - landofstoopid.bmp
        [1] => image/bmp
        [2] => 310342
        [3] => C:\xampp\tmp\php9758.tmp
        [4] => .bmp
        [5] => landofstoopid.bmp
    )
)

这是我的SQL查询生成:

$new = array();
foreach($files as $key => $value)
{
    $new[] = "'".implode("','", $value)."', '$guid', '$getthedate', '$gettime', '$mailid', '$target'";
}
$query = "(".implode("), (",$new).")";
这是SQL查询的输出

INSERT INTO files (filename, filetype, filesize, filetempname, guid, dateadded, timeadded, mailid, target) 
VALUES ('966c5853-63b4-4570-a3ee-bd5629688038 - cycles.pdf','application/pdf','331881','C:\xampp\tmp\php9738.tmp','.pdf','cycles.pdf', '966c5853-63b4-4570-a3ee-bd5629688038', '13 Jun 2013', '10:25:07', '77', 'files/pics/landofstoopid.bmp'), 
('966c5853-63b4-4570-a3ee-bd5629688038 - landofstoopid.bmp','image/bmp','310342','C:\xampp\tmp\php9758.tmp','.bmp','landofstoopid.bmp', '966c5853-63b4-4570-a3ee-bd5629688038', '13 Jun 2013', '10:25:07', '77', 'files/pics/landofstoopid.bmp')
这就是我必须确定文件应该放在哪里的地方

$pics = array(".bmp", ".gif", ".jpg", "jpeg", ".png"); //5              
$docs = array(".doc", "docx", ".odt", ".pdf", ".ppt", "pptx", ".rtf", ".txt", ".xls", "xlsx"); //10             
$misc = array(".csv", ".htm", "html", ".php", ".pkt", ".rar", ".sql", ".xpi", ".zip"); //9

if (in_array($extension,$pics))
{
    $target = "".FILES."/".FUP_PICS."/";
}
else if (in_array($extension,$docs))
{
    $target = "".FILES."/".FUP_DOCS."/";
}
else if (in_array($extension,$misc))
{
    $target = "".FILES."/".FUP_MISC."/";
}
$target = $target.$tgt;
我在foreach循环内部和外部都尝试过这个方法来获取多个文件的值,结果都是一样的

文件的目标始终根据最后一个文件名和扩展名确定。如上所述,我有一个.pdf和一个.bmp,pdf应该放在docs文件夹中,bmp应该放在pics文件夹中。但是,这两个文件都将被发送到pics文件夹,并且名称更改为阵列中的最后一个文件

我只是想知道我是否能得到一些关于我哪里出了问题的指示,或者这是否可能

我要补充的是,当该文件作为单个文件上载时,不会出现此问题,并且该文件会转到正确的文件夹


提前感谢您的代码选择要在works中放置文件的文件夹,尽管您可能应该对无法识别的扩展名执行默认操作

由于这里的一切似乎都井然有序,问题很可能在别处

sql的结构让我怀疑您没有在sql生成代码迭代之间更改目标。您确定您的变量名拼写正确吗?是否总是最后使用的文件的扩展名和名称?在我看来,这似乎是一个保留变量问题

考虑删除代码以确定文件的放置位置,并将其替换为函数vis:

function set_target($extension)
    {
    $target="";
    $pics = array(".bmp", ".gif", ".jpg", "jpeg", ".png"); //5              
    $docs = array(".doc", "docx", ".odt", ".pdf", ".ppt", "pptx", ".rtf", ".txt", ".xls", "xlsx"); //10             
    $misc = array(".csv", ".htm", "html", ".php", ".pkt", ".rar", ".sql", ".xpi", ".zip"); //9

    if (in_array($extension,$pics))
        {
        $target = "".FILES."/".FUP_PICS."/";
        }
        else if (in_array($extension,$docs))
        {
        $target = "".FILES."/".FUP_DOCS."/";
        }
        else if (in_array($extension,$misc))
        {
        $target = "".FILES."/".FUP_MISC."/";
        }
    $target = $target.$tgt;
    echo $target."<BR>"; //this line for debugging - should see as many lines as you have files.  If not, the problem is in your iteration loop.
    return($target);
    }
函数集\u目标($extension)
{
$target=“”;
$pics=数组(“.bmp”、“.gif”、“.jpg”、“jpeg”、“.png”);//5
$docs=数组(“.doc”,“docx”,“.odt”,“.pdf”,“.ppt”,“pptx”,“.rtf”,“.txt”,“.xls”,“xlsx”);//10
$misc=array(“.csv”、“.htm”、“.php”、“.pkt”、“.rar”、“.sql”、“.xpi”、“.zip”);/9
if(在_数组中($extension,$pics))
{
$target=”“.FILES.“/”.FUP_PICS.“/”;
}
else if(在_数组中($extension,$docs))
{
$target=”“.FILES.“/”.FUP_DOCS.“/”;
}
else if(在数组中($extension,$misc))
{
$target=”“.FILES.“/”.FUP_MISC.“/”;
}
$target=$target.$tgt;
echo$target.“
”;//这一行用于调试-应能看到尽可能多的文件行。否则,问题就出在迭代循环中。 回报(目标美元); }
而不是内联代码。这可能有助于揭示未正确分配目标的位置,这是一种良好的做法

或者,不要尝试进行单个SQL查询,而只是为每个文件生成一个新的SQL


如果您提供其余的代码,您可能会得到一个更完整的答案,但我猜这将解决它。生成sql的位将非常有用。

您的代码可以选择将文件放置在哪个文件夹中,尽管您可能应该对无法识别的扩展名执行默认操作

由于这里的一切似乎都井然有序,问题很可能在别处

sql的结构让我怀疑您没有在sql生成代码迭代之间更改目标。您确定您的变量名拼写正确吗?是否总是最后使用的文件的扩展名和名称?在我看来,这似乎是一个保留变量问题

考虑删除代码以确定文件的放置位置,并将其替换为函数vis:

function set_target($extension)
    {
    $target="";
    $pics = array(".bmp", ".gif", ".jpg", "jpeg", ".png"); //5              
    $docs = array(".doc", "docx", ".odt", ".pdf", ".ppt", "pptx", ".rtf", ".txt", ".xls", "xlsx"); //10             
    $misc = array(".csv", ".htm", "html", ".php", ".pkt", ".rar", ".sql", ".xpi", ".zip"); //9

    if (in_array($extension,$pics))
        {
        $target = "".FILES."/".FUP_PICS."/";
        }
        else if (in_array($extension,$docs))
        {
        $target = "".FILES."/".FUP_DOCS."/";
        }
        else if (in_array($extension,$misc))
        {
        $target = "".FILES."/".FUP_MISC."/";
        }
    $target = $target.$tgt;
    echo $target."<BR>"; //this line for debugging - should see as many lines as you have files.  If not, the problem is in your iteration loop.
    return($target);
    }
函数集\u目标($extension)
{
$target=“”;
$pics=数组(“.bmp”、“.gif”、“.jpg”、“jpeg”、“.png”);//5
$docs=数组(“.doc”,“docx”,“.odt”,“.pdf”,“.ppt”,“pptx”,“.rtf”,“.txt”,“.xls”,“xlsx”);//10
$misc=array(“.csv”、“.htm”、“.php”、“.pkt”、“.rar”、“.sql”、“.xpi”、“.zip”);/9
if(在_数组中($extension,$pics))
{
$target=”“.FILES.“/”.FUP_PICS.“/”;
}
else if(在_数组中($extension,$docs))
{
$target=”“.FILES.“/”.FUP_DOCS.“/”;
}
else if(在数组中($extension,$misc))
{
$target=”“.FILES.“/”.FUP_MISC.“/”;
}
$target=$target.$tgt;
echo$target.“
”;//这一行用于调试-应能看到尽可能多的文件行。否则,问题就出在迭代循环中。 回报(目标美元); }
而不是内联代码。这可能有助于揭示未正确分配目标的位置,这是一种良好的做法

或者,不要尝试进行单个SQL查询,而只是为每个文件生成一个新的SQL


如果您提供其余的代码,您可能会得到一个更完整的答案,但我猜这将解决它。生成sql的位会很有用。

我看到的第一件事是:
strtolower(substr($file\u name,strlen($file\u name)-4,strlen($file\u name))
不能使用4个字母的扩展名。。。它不会给你一些你可以匹配的东西…嗨,zero0,它确实有效,只是不包括。对于word文件,例如:97-2003,它将获得2010年的.doc+它将获得docx,数组反映了这一点。如果您查看docs数组,它有.doc和docx来考虑4个字母的扩展名对不起,@Chris,我查看了您的4个字母数组元素中缺少的点:-)我看到的第一件事是:
strtolower(substr($file\u name,strlen($file\u name)-4,strlen($file\u name))
不能使用4个字母的扩展名。。。它不会给你一些你可以匹配的东西…嗨,zero0,它是