PHP可以轻松处理多个文件上传

PHP可以轻松处理多个文件上传,php,upload,Php,Upload,解决了使用php.net post方法处理多个上传的示例,使用andre的答案获得知识,这就是我选择它作为答案的原因,现在开始 foreach ($_FILES["userfile"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { if ($x=="0"){ $data=explode(".",$_FILES["userfile"]["name"][$key]); $named=$id[id].

解决了使用php.net post方法处理多个上传的示例,使用andre的答案获得知识,这就是我选择它作为答案的原因,现在开始

foreach ($_FILES["userfile"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
  if ($x=="0"){
    $data=explode(".",$_FILES["userfile"]["name"][$key]);
    $named=$id[id].".".$data[1];
    $x=$x+1;
    }else{
    $data=explode(".",$_FILES["userfile"]["name"][$key]);
    $named=$id[id]."-".$x.".".$data[1];
    $x=$x+1;
    }
    $uploaddir = '/home/content/92/8498392/html/items/'.$_POST[catid];
    $tmp_name = $_FILES["userfile"]["tmp_name"][$key];
    move_uploaded_file($tmp_name, "$uploaddir/$named");
}
}

结果是第一张图片上传为45.jpg,第二张上传为45-1.jpg,依此类推!谢谢大家的帮助:D


<?php
$id = 877;
$x = 0;
foreach ($_FILES as $file) {
  $data = explode(".", $file['userfile']['name']);
  $fileExtension = $data[count($data)-1];
  if ($x == 0) {
    $filePath = '/home/content/92/8498392/html/items/' . $_POST['catid'] . '/' . $id . '.' . $fileExtension; 
  }
  else {
    $filePath = '/home/content/92/8498392/html/items/'.$_POST['catid'].'/' . $id . '-' . $x . '.' . $fileExtension;
  }
  move_uploaded_file($file['userfile']['tmp_name'], $filePath);
  $x++;
}
?>
试试看。



试试看。

问题在于如何迭代$\u文件数组。它不会像您认为的那样处理多个文件。请使用下面的函数并将它们合并到脚本中。下面的脚本归功于PHP网站上的那个家伙。链接在代码下面

function multiple(array $_files, $top = TRUE)
{
    $files = array();
    foreach($_files as $name=>$file){
        if($top) $sub_name = $file['name'];
        else    $sub_name = $name;

        if(is_array($sub_name)){
            foreach(array_keys($sub_name) as $key){
                $files[$name][$key] = array(
                    'name'     => $file['name'][$key],
                    'type'     => $file['type'][$key],
                    'tmp_name' => $file['tmp_name'][$key],
                    'error'    => $file['error'][$key],
                    'size'     => $file['size'][$key],
                );
                $files[$name] = multiple($files[$name], FALSE);
            }
        }else{
            $files[$name] = $file;
        }
    }
    return $files;
}

print_r($_FILES);
/*
Array
(
    [image] => Array
        (
            [name] => Array
                (
                    [0] => 400.png
                )
            [type] => Array
                (
                    [0] => image/png
                )
            [tmp_name] => Array
                (
                    [0] => /tmp/php5Wx0aJ
                )
            [error] => Array
                (
                    [0] => 0
                )
            [size] => Array
                (
                    [0] => 15726
                )
        )
)
*/
$files = multiple($_FILES);
print_r($files);
/*
Array
(
    [image] => Array
        (
            [0] => Array
                (
                    [name] => 400.png
                    [type] => image/png
                    [tmp_name] => /tmp/php5Wx0aJ
                    [error] => 0
                    [size] => 15726
                )
        )
)
*/
?>

我从

中获取了这个,问题是如何迭代$\u文件数组。它不会像您认为的那样处理多个文件。请使用下面的函数并将它们合并到脚本中。下面的脚本归功于PHP网站上的那个家伙。链接在代码下面

function multiple(array $_files, $top = TRUE)
{
    $files = array();
    foreach($_files as $name=>$file){
        if($top) $sub_name = $file['name'];
        else    $sub_name = $name;

        if(is_array($sub_name)){
            foreach(array_keys($sub_name) as $key){
                $files[$name][$key] = array(
                    'name'     => $file['name'][$key],
                    'type'     => $file['type'][$key],
                    'tmp_name' => $file['tmp_name'][$key],
                    'error'    => $file['error'][$key],
                    'size'     => $file['size'][$key],
                );
                $files[$name] = multiple($files[$name], FALSE);
            }
        }else{
            $files[$name] = $file;
        }
    }
    return $files;
}

print_r($_FILES);
/*
Array
(
    [image] => Array
        (
            [name] => Array
                (
                    [0] => 400.png
                )
            [type] => Array
                (
                    [0] => image/png
                )
            [tmp_name] => Array
                (
                    [0] => /tmp/php5Wx0aJ
                )
            [error] => Array
                (
                    [0] => 0
                )
            [size] => Array
                (
                    [0] => 15726
                )
        )
)
*/
$files = multiple($_FILES);
print_r($files);
/*
Array
(
    [image] => Array
        (
            [0] => Array
                (
                    [name] => 400.png
                    [type] => image/png
                    [tmp_name] => /tmp/php5Wx0aJ
                    [error] => 0
                    [size] => 15726
                )
        )
)
*/
?>

我从

中获取了这个功能,只需使用我提供的功能并合并如下:

<?php
$id = 877;
$x = 0;
$_FILES = multiple($_FILES); // taken from above snippet from php.net
foreach ($_FILES as $fileKey => $file) {
  $data = explode(".", $file['name']);
  $fileExtension = $data[count($data)-1];
  if ($x == 0) {
    $filePath = '/home/content/92/8498392/html/items/' . $_POST['catid'] . '/' . $id . '.' . $fileExtension; 
  }
  else {
    $filePath = '/home/content/92/8498392/html/items/'.$_POST['catid'].'/' . $id . '-' . $x . '.' . $fileExtension;
  }
  move_uploaded_file($file['tmp_name'], $filePath);
  $x++;
}
?>

只需使用我提供的功能,如下面所示:

<?php
$id = 877;
$x = 0;
$_FILES = multiple($_FILES); // taken from above snippet from php.net
foreach ($_FILES as $fileKey => $file) {
  $data = explode(".", $file['name']);
  $fileExtension = $data[count($data)-1];
  if ($x == 0) {
    $filePath = '/home/content/92/8498392/html/items/' . $_POST['catid'] . '/' . $id . '.' . $fileExtension; 
  }
  else {
    $filePath = '/home/content/92/8498392/html/items/'.$_POST['catid'].'/' . $id . '-' . $x . '.' . $fileExtension;
  }
  move_uploaded_file($file['tmp_name'], $filePath);
  $x++;
}
?>



很高兴它报告了一个错误。PHP非常擅长报告错误,不幸的是,除非你发布错误,否则我们几乎不可能破译错误的意思。@Francis:不幸的是,我自学成才,在错误报告方面非常糟糕。通常我可以自己找出什么地方出了问题,但错误只是简单地说是错误。我删除了脚本的这一部分,现在它完成并更新了数据库,但不会上载文件。这些文件的大小不超过1M,并且没有超出限制。我只上传了5个文件,文件限制是20个。dir路径适用于mkdir,因此我不确定发生了什么。也许上传的文件是错误的?查看您的PHP日志文件,它会向您显示错误的详细信息。您的错误日志将在网站的conf文件中定义,或者如果您在共享主机服务器上,您可能只能通过提供的控制面板访问。@Francis我检查了我的控制面板和ftp以获取错误日志,只能从bing和google等处找到机器人错误日志。没有php错误日志。您可能需要询问主机。托管提供商应该始终允许您访问错误日志。它报告了一个错误,这很好。PHP非常擅长报告错误,不幸的是,除非你发布错误,否则我们几乎不可能破译错误的意思。@Francis:不幸的是,我自学成才,在错误报告方面非常糟糕。通常我可以自己找出什么地方出了问题,但错误只是简单地说是错误。我删除了脚本的这一部分,现在它完成并更新了数据库,但不会上载文件。这些文件的大小不超过1M,并且没有超出限制。我只上传了5个文件,文件限制是20个。dir路径适用于mkdir,因此我不确定发生了什么。也许上传的文件是错误的?查看您的PHP日志文件,它会向您显示错误的详细信息。您的错误日志将在网站的conf文件中定义,或者如果您在共享主机服务器上,您可能只能通过提供的控制面板访问。@Francis我检查了我的控制面板和ftp以获取错误日志,只能从bing和google等处找到机器人错误日志。没有php错误日志。您可能需要询问主机。托管提供商应始终允许您访问错误日志。请尝试,不幸的是,它仍然无法工作。它不会上传任何文件!这是我的照片表单字段,如果有帮助的话,它们都是一样的,我想这就是它的工作原理。不幸的是,它没有上传任何东西。我还坚持echo$filepath;在move_上传了_文件后,没有任何东西从中打印出来。。。与脚本一样,x也被设置为0。请尝试,不幸的是,它仍然无法工作。它不会上传任何文件!这是我的照片表单字段,如果有帮助的话,它们都是一样的,我想这就是它的工作原理。不幸的是,它没有上传任何东西。我还坚持echo$filepath;在move_上传了_文件后,没有任何东西从中打印出来。。。x也被设置为0,就像您的脚本一样。@Andrew Honsberg ok,那么这将返回数组$files,其中的值$files[name]包含名称和$files[tmp_name],然后我可以使用它们将tmp文件移动到新文件夹,并以与以前相同的方式更改名称,只是没有foreach?我在php.net上读了很多这样的例子,但不理解它们,这就是我来这里的原因。我很欣赏这段代码,我将运行一些测试并尝试使用它。如果有人能让我重述我所做的一切,那也太棒了:d再次感谢andre。我按照你说的做了,我想我终于明白了,但是在调用multiple函数后尝试遍历文件时,我遇到了一个错误。如果我理解正确的话,它现在应该在我以前的脚本中工作。这是错的吗?foreach(多个($_文件)作为$file){if($x=“0”){$data=explode(“.”,$FILES['name']);$name=$id.“..$data[1];$uploaddir='/home/content/92/8498392/html/items/'.$_POST[catid]./';$uploadfile=$uploaddir.$name;move_上传的文件($FILES['tmp\u name'],$uploadfile],$uploadfile);echo$uploadfile;$x=$x=$x+1;}我在页面末尾遇到了一个意外的$end错误,但当我删除令人不快的foreach语句时,它就消失了,这使我认为我在这里遗漏了什么。在使用multiple函数将数组从一个3步数组处理为一个2步数组后,我应该能够使用该脚本对其进行迭代,对吗?@Andrew Honsberg ok,这将返回数组$files,其值为$files[name],保存名称和$files[tmp_name],然后我可以使用它们将tmp文件移动到新文件夹,并以与以前相同的方式更改名称,除了没有foreach?I之外