2012-02-01 153 views
1

解决!从php.net post方法中使用这个例子来处理多个上传,通过使用andre的答案获得的知识,这就是为什么我选择它作为答案,在这里它!PHP处理多个文件上传EASY

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

+2

这是很好,它报告了一个错误。 PHP非常适合报告错误,不幸的是,除非您发布错误,否则我们几乎不可能破译错误说的或意味着什么。 – 2012-02-01 02:06:02

+0

@Francis:不幸的是,我是自学的,在错误报告方面真的很糟糕。通常我可以自己弄清楚什么是错的,但错误只是说错误。我删除了那部分脚本,现在它完成并更新了数据库,但不会上传文件。文件不大于1M,并且没有超出限制。而我只上传五个文件,文件限制为20. dir路径适用于mkdir,所以我不确定最新消息。也许上传的文件是错误的? – HenryGuy 2012-02-01 02:10:10

+0

查看您的PHP日志文件,它应该向您显示有关错误的详细信息。 您的错误日志将在您的网站conf文件中定义,或者如果您位于共享托管服务器上,则可能只能通过提供的控制面板访问它。 – 2012-02-01 02:53:06

回答

2

问题是你如何迭代$ _FILES数组。它不像你想象的那样处理多重文件,所以使用下面的函数并将它们合并到脚本中。以下脚本的功劳归功于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 website

+0

@Andrew Honsberg ok,所以这将返回数组$文件,其中将包含名为$ files [name]和$ files [tmp_name]的值,然后可以使用该文件将tmp文件移动到新文件夹并更改这个名字和我以前一样,除了没有任何foreach之外呢?我在php.net上阅读了很多这些示例,但无法理解它们,这就是我来到这里的原因。我很欣赏代码,我会运行一些测试并尝试使用它。如果任何人都可以让我重温一下我做过的事情,那也太棒了:D再次感谢你。 – HenryGuy 2012-02-01 03:51:53

+0

我做了你所说的,我想我最终理解了它,但是在调用多重函数后尝试迭代文件时出现错误。如果我理解正确,它应该在我之前的脚本中工作。这是错的吗? ($ _ FILES)作为$ file){if($ x =“0”){ $ data = explode(“。”,$ files ['name']); $ name = $ id。“。”。$数据[1]; $ uploaddir ='/home/content/92/8498392/html/items/'.$_POST[catid].'/'; $ uploadfile = $ uploaddir。 $名称; move_uploaded_file($ files ['tmp_name'],$ uploadfile); echo $ uploadfile; $ x = $ x + 1; } – HenryGuy 2012-02-01 04:14:50

+0

我在页面末尾收到一个意外的$ end错误,但当我删除违规的foreach语句时,它会消失,这使得我认为我在这里丢失了某些东西。使用多个函数将数组从3步数组操作为2步数组后,我应该可以通过该脚本遍历它,正确吗? – HenryGuy 2012-02-01 04:16:17

1
<?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++; 
} 
?> 

试试看。

+0

试过了,不幸的是它仍然无法工作。它不会上传任何文件!这是我的表单字段的照片,如果有帮助,他们都是一样的,我认为它是如何工作的。 HenryGuy 2012-02-01 03:12:22

+0

不幸的是它没有上传任何东西。我也卡住echo $ filepath;在move_uploaded_file之后,没有任何东西从它打印出来...... x也像你的脚本一样被设置为0。 – HenryGuy 2012-02-01 03:23:22

1

只是用我提供的功能,并纳入象下面这样:

<?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++; 
} 
?>