Загрузка нескольких фото PHP

193
11 марта 2018, 21:48

Ситуация такая, могу загружать по одному фото, но потребовалось сделать загрузку нескольких, решил написать отдельную функцию, но что то запутался. Код при загрузке 1 файла

// Проверка, загружено изображение или нет
if (is_uploaded_file($_FILES["image"]["tmp_name"])) {
    // Если загружено, переместить его в нужную папку
    move_uploaded_file($_FILES["image"]["tmp_name"], $_SERVER['DOCUMENT_ROOT'] . "/upload/images/products/{$id}.jpg");
}

html код

<input type="file" name="image" placeholder="" value="">

Для загрузки нескольких фото создал отдельную функцию, код ниже

public static function UploadPhoto($id)
{       
    $file_count = count($_FILES["image"]);
    $file_keys = array_keys($_FILES["image"]);
    for ($i=0; $i<$file_count; $i++) {
        if (is_uploaded_file($_FILES["image"]["tmp_name"])) {
            // Если загружалось, переместим его в нужную папке, дадим новое имя
            move_uploaded_file($_FILES["image"]["tmp_name"], $_SERVER['DOCUMENT_ROOT'] . "/upload/images/products/{$id}_{$i}.jpg");
        }    
    }
}

вызываю функцию upl::UploadPhoto($id);

изменил html код

<input type="file" name="image[]" placeholder="" value="">
<input type="file" name="image[]" placeholder="" value="">

Мое видение ситуации -> нужно создать массив image, передать туда все загруженные файлы, передать этот массив функции, в функции получить количество загруженных файлов, переместить файлы в нужную директорию. По коду думаю что ошибка в функции том месте, где идет обращение к глобальному массиву $_FILES, подскажите как правильно сделать

Answer 1

Во первых, массив файлов хранится так.

array(1) images {
    [tmp_name] => [
        [0] => /file1.tmp
        [1] => /file2.tmp
        [2] => /file1.tmp 
    ]
    [name] => [
        [0] => /file1.jpg
        [1] => /file2.png
        [2] => /file1.gif
    ]
    ...
}

А значит это :

$file_count = count($_FILES["image"]);

Нужно написать так :

$file_count = count($_FILES["image"]['name']);

А значит обработка массива будет другая.

for($i = 0; $i < $file_count;$i++){
    move_uploaded_file($_FILES['image'][$i]['tmp_name'], $_SERVER['DOCUMENT_ROOT'] . "/upload/images/products/{$id}_{$i}.jpg"
}

Во вторых, не обязательно в HTML добавлять два поля. Достаточно указать в name массив.

<input type="file" name="image[]" placeholder="" value="">

P.S. Советую проверять $_FILES['image'][$i]['type'] и сохранять нужный формат, ибо сохранять gif в jpeg не самая лучшая идея.

READ ALSO
добавление данных в базу [дубликат]

добавление данных в базу [дубликат]

На данный вопрос уже ответили:

185
Как наложить на фото эффект в CSS, и забрать эту картинку с этим же эффектом?

Как наложить на фото эффект в CSS, и забрать эту картинку с этим же эффектом?

Если я применяю -webkit-filter: grayscale(100%); картинка будет с фильтром только в рамках сайтаМожно ли, допустим скачивать эту картинку с этим же эффектом?...

197
jquery создание полноценной таблицы

jquery создание полноценной таблицы

получаю кучу информации через ajax (человек просто вбивает в поиске нужное слово и получает кучу инфы), и ее нужно красиво вывестиТо есть создать...

188
Как сделать окно разговора

Как сделать окно разговора

Привет! Мне нужно сделать так как на скриншоте

265