2013-05-17 3 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']); 
      } 
     } 
    } 
} 
?> 

Я проверил мою форму, и все имена файлов по полей, независимо друг от друга по имени и матч. Это не проблема синтаксиса, потому что первый цикл проверки ошибок работает безупречно. его только когда я пытаюсь загрузить файл, он начинает перезаписывать.

Может ли кто-нибудь просветить меня? (Я довольно большой нуб поэтому постарайтесь держать его в 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 загружено.

+0

пожалуйста, покажите нам свою форму – Potheek

ответ

1

Вы должны переименовать файл, который вы загружаете, не доверяйте ввод данных пользователем ... Вы можете поставить метку времени UNIX или уникальный идентификатор за имя изображения

+1

Dont я сделать это с помощью: '$ movefile_path = $ _SERVER ['DOCUMENT_ROOT']."/Cdsite/images/storyimages/". substr (md5 (time()), 0, 10). "" , strtolower (end (explode ('.', $ _FILES ['story_image_'.$ value] ['name']))); ' – willy

+0

, если вы не хотите его перезаписывать, проверьте, существует ли файл, если он уже существует, дайте ему другое имя (я думаю, это то, что вы хотите) –

+0

Thank вы за свою помощь Натан. Да благословит Бог, продолжай хорошую работу! Я обновил свой вопрос с помощью приведенного выше рабочего кода. – willy

Смежные вопросы