所以我想一次上傳多個文件,但每次我只是上傳文件上傳的最後一個文件,我嘗試去做。最終,它只是上傳一個文件到我的服務器,我的數據庫中的多個點引用。用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的實際文件名上傳。
請告訴我們您的形式 – Potheek