Так что я пытаюсь загрузить сразу несколько файлов, но каждый раз, когда я делаю это, вы загружаете последний файл в цикл для каждой загрузки файла, который я пытаюсь сделать. В конечном итоге это только загрузка одного файла на мой сервер, на который ссылаются несколько точек в моей базе данных.Загрузка нескольких файлов с помощью 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']);
}
}
}
}
?>
Я проверил мою форму, и все имена файлов по полей, независимо друг от друга по имени и матч. Это не проблема синтаксиса, потому что первый цикл проверки ошибок работает безупречно. его только когда я пытаюсь загрузить файл, он начинает перезаписывать.
Может ли кто-нибудь просветить меня? (Я довольно большой нуб поэтому постарайтесь держать его в NEWB говорят)
** * ** Update * ** * ** * *** *
Так что я решил эту проблему сейчас и ниже рабочий код:
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 хэширована после отметки времени хэша md5, чтобы создать новое уникальное имя файла. Я использовал путь к файлу $ movefile_path, чтобы проверить, существует ли файл, потому что это может использовать путь php.
Я также включил обновленную переменную $ file_path в обновленный путь $ movefile_, иначе повторная хэширование случайной строки дало бы мне другое имя файла для html для ссылки из моей базы данных, чем фактическое имя файла, которое php загружено.
пожалуйста, покажите нам свою форму – Potheek