Загрузка файла PHP - несколько файлов - PullRequest
1 голос
/ 15 февраля 2012

используя следующий PHP, я пытаюсь загрузить несколько изображений.Количество загружаемых изображений может быть различным.

Проблема, с которой я столкнулся, заключается в том, что изображение № 1 не загружается, однако его путь к файлу выводится на экран.

Код: -

if ($_FILES['pac_img_1']['name']>""){
    echo("You have uploaded the following images:-<ul>");
    for ($i=1; $i<=$imagesCount; $i++){ 
        $target_path = "files/" . $companyName . "/images/";
        $target_path = $target_path . basename( $_FILES['pac_img_' . $i]['name']); 
        if(move_uploaded_file($_FILES['pac_img_' . $i]['tmp_name'], $target_path)) {
            echo "<li><a href='". $target_path . "'>".  basename( $_FILES['pac_img_' . $i]['name']). "</a></li>";
        } else{
            echo "There was an error uploading an image";
        }
};
    echo("</ul>");
}else{
    echo("None uploaded");
};

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

Помощь будет принята с благодарностью.

Изменить, чтобы добавить, что $ imagesCount берет свое значение из элемента формы через запрос $ _POST.Если загружено только одно изображение, это значение = 0.

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

Не будучи php-чуваком, я бы попробовал изменить

for ($i=1; $i<=$imagesCount; $i++){

до

for ($i=0; $i<=$imagesCount; $i++){

-или, может быть

for ($i=0; $i < $imagesCount; $i++){

в зависимости от того, как установлено $ imagesCount.

0 голосов
/ 15 февраля 2012

Ваш цикл for необходимо изменить. Индексы массива начинаются с 0. И последний элемент должен иметь длину массива - 1; Ваш цикл for необходимо изменить, как показано ниже.

На самом деле, он проходит через несколько $ _POST itens. Его HTML, вероятно, имеет что-то вроде:

<input type="file" name="pac_img_1">
<input type="file" name="pac_img_2">
<input type="file" name="pac_img_3">

и он пытается получить эти изображения.

Я бы сделал это по-другому.

HTML:

<input type="file" name="pac_img[]" />
<input type="file" name="pac_img[]" />
<input type="file" name="pac_img[]" />

(обратите внимание, что вы можете динамически добавлять входы файлов, не беспокоясь об именах)

PHP:

if (count($_FILES['pac_img']) > 0){
    echo("You have uploaded the following images:-<ul>");

    foreach($_FILES['pac_img'] as $key => $file){
        $target_path = "files/" . $companyName . "/images/";
        $target_path = $target_path . basename( $file['name']); 
        if(move_uploaded_file($file['tmp_name'], $target_path)) {
            echo "<li><a href='". $target_path . "'>".  basename( $file['name'] ). "</a></li>";
        } else{
            echo "There was an error uploading an image";
        }
    }
    echo("</ul>");
}else{
    echo("None uploaded");
}

И последнее, но не менее важное: ВСЕГДА проверяйте, являются ли загруженные файлы такими, какими они должны быть. (http://www.acunetix.com/websitesecurity/upload-forms-threat.htm)

0 голосов
/ 15 февраля 2012

Ваш цикл for необходимо изменить. Индексы массива начинаются с 0. И последний элемент должен иметь длину массива - 1;

Ваш цикл for необходимо изменить, как показано ниже.

if ($_FILES['pac_img_1']['name']>""){
    echo("You have uploaded the following images:-<ul>");
    for ($i=0; $i<$imagesCount; $i++){ 
        $target_path = "files/" . $companyName . "/images/";
        $target_path = $target_path . basename( $_FILES['pac_img_' . $i]['name']); 
        if(move_uploaded_file($_FILES['pac_img_' . $i]['tmp_name'], $target_path)) {
            echo "<li><a href='". $target_path . "'>".  basename( $_FILES['pac_img_' . $i]['name']). "</a></li>";
        } else{
            echo "There was an error uploading an image";
        }
};
    echo("</ul>");
}else{
    echo("None uploaded");
};
...