Как загрузить несколько файлов php
Подскажите, как сделать форму загрузки нескольких файлов одновременно?
Либо множественный выбор фалов, либо возможность добавлять поля выбора файла при нажатии на какую-нибудь кнопку.
Добавлено через 2 часа 16 минут
Форму переделал.
Теперь можно выбирать несколько файлов.
В $_FILES теперь передается такое:
Как разобрать этот массив и сделать обработку по подобию загрузки одного файла?
Еще раз скрипт обработки:
Никак не пойму Массивы совсем не мое.
__________________Помощь в написании контрольных, курсовых и дипломных работ здесь
Форма загрузки файлов-изображений на сервер
Скорее всего тут не один пхп. Но вообще не сильно силен - пытаюсь на примерах с вебом разобраться.
Форма загрузки файлов на сервер. Как получить ссылку
Здравствуйте! Прошу помощи. Очень нужно что бы форма загрузки файлов на сервер после выдавала.
Форма загрузки нескольких изображений
+ взаимодействие сразу с двумя таблицами БД. <form action="load.php" method="post"> <input.
Вывод файлов и форма загрузки/удаления файлов работают на одной странице, а на другой в ячейках таблицы нет
Доброго времени суток. В общем ситуация следующая. В своем профиле пользователь загружает файлы.
Вот это вы зря, как можно программировать без понимания массивов?
По поводу вашего вопроса, с ходу только вижу пробежаться в цикле по элементам массива например так:
Да они мне трудно даются + пошли вторые сутки без сна, мозг раком встает уже.
Спасибо за ответ. Вернусь с совещания и проверю.
Добавлено через 45 минут
Xenox, Огромное спасибо. Ваш пример помог мне разобраться и дописать нужный функционал.
Сейчас приведу код в порядок и выложу решение, вдруг кому понадобится.
Добавлено через 3 минуты
Может не совсем изящно, но работает. Нужные файлы загружает, а файлы с неположенным расширением отсеивает.
Ошибка загрузки нескольких файлов
Здравствуйте! Когда делаю загрузку на сервер один файл ссылка на бд выводит правильно. А если делаю.
ajax + php форма загрузки файлов
Приветствую всех! Есть такая задача сделать форму для отправки статьи на сайт с загрузкой.
Сервер загрузки файлов
Хочу сделать, что-то типа сервера закачки файлов. Сперва хотел сделать на основе асинхронных.
Сегодня я хочу рассказать вам о разнообразных ситуациях, в которых требуется загрузка файлов на сайт с помощью PHP-скриптов . Постараюсь привести примеры, как самой простой загрузки файла, так и мультизагрузки с применением move uploaded file PHP .
Простая загрузка файлов на сайт при помощи PHP
Вам не составит труда написать собственный PHP-скрипт для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input . Затем привязать к ней PHP-скрипт , который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта , выполните следующие действия:
Создайте простую HTML-форму : потребуется простая форма с возможностью указания файла. Она размещается в файле basic.php :
Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload , форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php :
Важно: не забудьте добавить enctype=”multipart/form-data” в тег <form> .
Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о загруженных файлах содержится в глобальной переменной $_FILES . То есть, используя $_FILES , можно проверить, был ли загружен файл. Если файл был загружен, то можно переместить его в нужную директорию при помощи функции move_uploaded_file PHP :
Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php .
Ниже приведена полная версия PHP move uploaded file примера :
Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP .
Вопрос: Почему приведенный выше скрипт небезопасен?
Ответ: С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “ живом ” сервере, то любой хакер сможет загрузить собственные PHP-скрипты , и взломать ваш сайт и сервер.
Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.
Что такое $_FILES?
То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим следующую информацию:
То есть, для каждого поля <input type=”file” name=”inputfile“/> в массиве создается элемент. Если вы создадите <input type=”file” name=”test”>, то название элемента также будет изменено на test . Например:
Теперь для каждого input file , перемещаемого с помощью move uploaded file PHP , создается пять элементов ( name , type , tmp_name , error , size ). Давайте познакомимся с этими элементами поближе:
- name: содержит название загруженного пользователем файла. Если вы загрузите файл abc.txt в браузер, то элемент name получит название abc.txt ;
- type: тип загруженного файла или mime-type , если точнее. Для файла JPG этот элемент будет иметь значение image/jpeg . Если загрузить текст, то элемент получит значение text/plain . Для разных типов файлов разным будет и mime-type . Ниже приведены самые распространенные mime-типы :
- JPEG: image/jpeg ;
- PNG: image/png ;
- Текст: text/plain ;
- Word: application/msword .
- tmp_name: временное расположение для загруженного файла. Этот путь можно изменить в переменной upload_tmp_dir , указанной в файле php.ini .
- error: информация об ошибке. Включает в себя тип ошибки, возникшей в процессе загрузки. Например, когда размер файла превышает максимальный или когда не был указан файл для загрузки. Для любой возникшей ошибки имеется числовое значение и константа. Ниже приведен полный список ошибок, которые могут возникнуть в PHP move uploaded file примере :
- UPLOAD_ERR_OK (значение 0) . Означает, что файл был успешно загружен без ошибок;
- UPLOAD_ERR_INI_SIZE (значение 1) . Размер файла превышает указанный в переменной upload_max_filesize в файле php.ini ;
- UPLOAD_ERR_FORM_SIZE (значение 2) . Размер файла превышает установленное в переменной формы MAX_FILE_SIZE значение;
- UPLOAD_ERR_PARTIAL (значение 3) . Файл загружен не полностью;
- UPLOAD_ERR_NO_FILE (значение 4) . Отсутствует файл для загрузки;
- UPLOAD_ERR_NO_TMP_DIR (значение 6) . Указанной директории для временного хранения не существует;
- UPLOAD_ERR_CANT_WRITE (значение 7) . Невозможно записать файл на диск.
- size: размер загруженного файла в байтах.
Что такое move_uploaded_file?
Если файл был успешно перемещен, то вы получите ответ true или false . В первом примере мы использовали следующую строку кода:
А теперь давайте сделаем красиво, и выведем информацию:
Изменяем лимит размера загружаемого файла
У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе пользователи станут загружать увесистые файлы. Выставить ограничение на move uploaded file PHP можно двумя способами:
Если нужно сильно увеличить filesize , то не забудьте изменить время исполнения php-скриптов .
Как обезопасить PHP-скрипт загрузки файлов
Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить типы файлов, которые загружают пользователи. Пришло время позаботиться о безопасности нашего PHP move uploaded file примера.
В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы размером свыше 1 Мб. Установите соответствующее ограничение в переменной upload_max_filesize файла php.ini . Ниже приведена улучшенная версия скрипта:
Мультизагрузка файлов при помощи PHP-скрипта
Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file PHP . Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHP-скрипта
- Используя разные имена Input .
- Используя одно и то же имя input, но с привлечением массива.
1. Используя разные имена Input:
Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано несколько основных элементов. Например, для приведенной ниже формы:
$_FILES представит массив следующего содержания:
Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один элемент предназначен для аватарки ( изображение ), а другой – для загрузки резюме ( файла в формате .doc ):
2. Используем одно поле input, но с применением массива:
Как и в случае с другими типами input , для move uploaded file PHP мы можем использовать массив с input type , указанным в php . То есть:
То есть, для приведенного выше HTML , $_FILES предоставит данные со следующей структурой:
Дайте знать, что вы думаете по этой теме статьи в комментариях. Мы очень благодарим вас за ваши комментарии, дизлайки, подписки, лайки, отклики!
Пожалуйста, оставьте свои отзывы по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, дизлайки, отклики, подписки, лайки!
В PHP-скрипте обработка загруженных через форму происходит через глобальный массив $_FILES , рассмотрим его содержимое:
Загрузка одного файла
Чтобы форма отправила файл, необходимо использовать только метод POST для отправки данных и добавить к тегу <form> атрибут enctype="multipart/form-data" , который определяет способ кодирования данных формы при их отправке на сервер.
Код скрипта index.php:
Результат:
Описание значений массива $_FILES :
Загрузка несколько файлов
Для загрузки сразу нескольких файлов к <input type="file"> нужно добавить атрибут multiple , а к имени поля – [] .
Код скрипта index.php
Результат:
Как видно, структура массива разделена по свойствам, а не по файлам. Для удобства работы с циклом foreach массив $_FILES можно преобразовать:
Результат:
Максимальный размер загружаемого файла
Размер загружаемого файла можно ограничить, добавив в форму скрытое поле с максимальным размером файла <input type="hidden" name="MAX_FILE_SIZE" value="2097152"> :
Коды ошибок загрузки файлов
Код | Константа | Описание |
---|---|---|
0 | UPLOAD_ERR_OK | Ошибок не возникло, файл успешно загружен на сервер. |
1 | UPLOAD_ERR_INI_SIZE | Размер файла превысил максимально допустимый размер, который задан директивой upload_max_filesize |
2 | UPLOAD_ERR_FORM_SIZE | Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме. |
3 | UPLOAD_ERR_PARTIAL | Загружаемый файл был получен только частично. |
4 | UPLOAD_ERR_NO_FILE | Файл не был загружен. |
6 | UPLOAD_ERR_NO_TMP_DIR | Отсутствует временная папка. |
7 | UPLOAD_ERR_CANT_WRITE | Не удалось записать файл на диск (возникает, когда на хостинге закончилось место). |
8 | UPLOAD_ERR_EXTENSION | PHP-расширение остановило загрузку файла. |
Настройки PHP
Обычно настройки загрузки файлов на хостинге вполне нормальные и не вызывают проблем, но есть исключения. Если не загружаются большие файлы, то скорее всего установлен лимит на размер загружаемого файла, ограничено время загрузки файла или ограничено количество одновременных загрузок.
Посмотреть установленные значения можно с помощью функции phpinfo() , в разделе «Core».
Сегодня загрузка файлов является практически неотъемлемым атрибутом современного web приложения. В данной статье речь пойдёт о том, как же загрузить файл(ы) на сервер с помощью PHP.
Настройка php.ini
Конфигурационный файл php.ini необходимо настраивать согласно бизнес-логики проекта! Например, мы планируем загружать не более десяти файлов до 2 Мбайт, а это значит нам понадобиться
Загрузка одного файла на сервер из формы
После отправки файла PHP-скрипту upload.php его можно перехватить с помощью суперглобальной переменной $_FILES с таким же именем, которая в массиве содержит информацию о файле (в нашем случае image ):
Для того, чтобы "редиска" не загрузил вредоносный код, встроенный в изображение, нельзя доверять функции getimagesize() , которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo . Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:
Таким образом, при необходимости, делаем проверку и на другие MIME-типы. Например, для zip архивов проверка будет такая:
На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize() , которой отдадим сам бинарный файл $_FILES['image']['tmp_name'] . В результате мы получим массив из элементов:
Для дальнейшей валидации изображения и работы над ним нам необходимо знать только 3 значения: ширину, высоту и размер файла (для вычисления размера применим функцию filesize() для бинарного файла из временной папки).
После всех проверок мы можем с уверенностью переместить наш загружаемый файл в какую-нибудь директорию с картинками. Делать лучше это через функцию move_uploaded_file(), которая работает в безопасном режиме. Перед перемещением файла нельзя забыть сгенерировать случайное имя и расширение из типа изображения для нашего файла. Вот так это выглядит:
Вместо простого способа генерации имени файла на основе MD5-хеша можно пойти более продвинутым путём, а именно написать отдельную функцию, которая будет проверять уникальность названия картинки для того, чтобы случайно не перезаписать уже загруженный файл. Если такого названия ещё нет, функция сгенерирует его. Такая проблема появляется в больших проектах и с большим количеством картинок. Но всё же)
Генерация имени для картинки теперь будет такой:
Мы реализовали простой, но в тоже время практичный (с точки зрения безопасности) механизм загрузки файла на сервер. Весь код целиком лежит здесь .
Загрузка нескольких файлов на сервер из формы
Разберём механизм загрузки нескольких изображений за один раз с локальной машины пользователя. Продолжим дальше работать с $_FILES . Наша новая HTML-форма будет немного отличаться от старой.
Как видно в конец имени поля выбора файла name="images[]" добавились фигурные скобки и атрибут multiple , который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES , но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:
Мы реализовали механизм загрузки нескольких файлов на сервер. Весь код целиком лежит здесь .
Читайте также: