2013-05-17 48 views
1

所以我想一次上傳多個文件,但每次我只是上傳文件上傳的最後一個文件,我嘗試去做。最終,它只是上傳一個文件到我的服務器,我的數據庫中的多個點引用。用php上傳多個文件而不覆蓋以前的文件

我已經嘗試在獨立函數和變量的循環之外執行上傳文件函數,但它仍在執行。

我的代碼:

<?php $image_number = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
$image_allowed = array('jpg', 'jpeg', 'gif', 'png'); 
if (empty($errors) === true) { 
    foreach ($image_number as $value) { 
    if (isset($_FILES['story_image_' . $value]) === true) { 
     if (empty($_FILES['story_image_' . $value]['name']) === false) { 
      if (in_array(strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))), $image_allowed) === false) { 
       $errors[] = 'Incorrect file type for \'Story image ' . $value . '\'. Allowed file types: ' . implode(', ', $image_allowed); 
      } else if ($_FILES['story_image_' . $value]['size'] > 1048576) { 
       $errors[] = 'Story image ' . $value . '\'s file size may not exceed 1 MB, or 1048576 Bytes.'; 
      } 
     } 
    } 
    } 
} 

foreach ($image_number as $value) { 
    if ($_POST['removeImage' . $value] === 'on') { 
     remove_story_image($story_data['story_id'], $value, $story_data['story_image_' . $value]); 
    } else { 
     if (isset($_FILES['story_image_' . $value]) === true) { 
      if (empty($_FILES['story_image_' . $value]['name']) === false) { 


       $file_path = '/cdsite/images/storyimages/' . substr(md5(time()), 0, 10) . '.' . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))); 
       $movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))); 
       move_uploaded_file($_FILES['story_image_' . $value]['tmp_name'], $movefile_path); 
       mysql_query("UPDATE `stories` SET `story_image_" . $value . "` = '" . mysql_real_escape_string($file_path) . "' WHERE `story_id` = " . $story_data['story_id']); 
      } 
     } 
    } 
} 
?> 

我已經檢查了我的形式,所有的文件字段的名稱的被獨立命名和匹配。這不是一個語法問題,因爲檢查錯誤的第一個循環是完美無缺的。它只有當我嘗試上傳文件時纔開始覆蓋。

任何人都可以啓發我嗎? (我是一個相當大的小白所以請儘量保持它在福利局說吧)

** * **更新* ** * ** * *** *

所以我現在已經解決了這個問題,並在下面的工作代碼:

foreach ($image_number as $value) { 
    if ($_POST['removeImage' . $value] === 'on') { 
     remove_story_image($story_data['story_id'], $value, $story_data['story_image_' . $value]); 
    } else { 
     if (isset($_FILES['story_image_' . $value]) === true) { 
      if (empty($_FILES['story_image_' . $value]['name']) === false) { 


       $file_path = '/cdsite/images/storyimages/' . substr(md5(time()), 0, 10) . '.' . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))); 
       $movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))); 
       if (file_exists($movefile_path) === true) { 
        $file_path = '/cdsite/images/storyimages/' . substr(md5(time()), 0, 10) . substr(md5(rand()),0,10) . '.' . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))); 
        $movefile_path = $_SERVER['DOCUMENT_ROOT'].$file_path; 
       } 
       move_uploaded_file($_FILES['story_image_' . $value]['tmp_name'], $movefile_path); 
       mysql_query("UPDATE `stories` SET `story_image_" . $value . "` = '" . mysql_real_escape_string($file_path) . "' WHERE `story_id` = " . $story_data['story_id']); 
      } 
     } 
    } 
} 

對於那些未來可能遇到類似問題的人,需要一個簡單的解釋,我常常在別人提供解釋時對其進行解釋,以下是對問題的解釋和解決方法。

問題是我是MD5哈希當我通過循環迭代的同時,改寫了相同的文件名與這行代碼:

$movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))); 

正如你看到我有兩個文件路徑。這不是爲了混淆任何人,而是允許我上傳一個絕對路徑給html,稍後可以引用的數據庫($ file_path)並且有一個php可以用來上傳文件的絕對路徑($ movefile_path)。

要解決問題,我有循環檢查,看看文件是否已經存在,如果是這樣,只是添加一個隨機字符串是md5散列後散列時間戳以創建一個新的唯一文件名。我使用$ movefile_path文件路徑來檢查文件是否存在,因爲這是php可以使用的路徑。

我也確保在已更新的$ movefile_path中包含已更新的$ file_path變量,否則重新哈希該隨機字符串會給我一個不同的文件名,以便從我的數據庫中引用不同於html的實際文件名上傳。

+0

請告訴我們您的形式 – Potheek

回答

1

您應該重命名您要上傳的文件,從不信任用戶輸入... 你可以把一個UNIX時間戳或唯一的ID映像名稱後面

+1

不要我這樣做有: '$ movefile_path = $ _SERVER ['DOCUMENT_ROOT']。「/ cdsite/images/storyimages /」。 substr(md5(time()),0,10)。 「」 。 strtolower(end(explode('。',$ _FILES ['story_image_')。$ value] ['name'])));' – willy

+0

如果你不想覆蓋,檢查文件是否已經存在,如果它已經存在,給它另一個名字(我想這就是你想要的) –

+0

謝謝你爲你的幫助彌敦道。上帝保佑,保持良好的工作!我用上面的工作代碼更新了我的問題。 – willy