2012-02-01 141 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++; 
} 
?>