Загрузка нескольких файлов на сервер php zhitsoboy.ru

Загрузка нескольких файлов на сервер php

Загрузка файлов на сервер

Что такое Upload files, или почему не работает
copy («c:imagessample.jpg», «http://mysite.ru/uploads/sample.jpg «)

Даже если у Вас в распоряжении всего один компьютер, на котором совмещен и сервер и рабочая станция, не стоит забывать о том, что php использует технологию клиент/сервер. Файл, который мы хотим загрузить, как правило, находится на машине клиента, т.е. пользователя, обыкновенного посетителя сайта. Место назначения — сервер. Для того чтобы совершить процесс передачи файла, нам понадобиться следующая форма:

При этом в поле action должен быть указан URL Вашего php-скрипта, который в дальнейшем будет заниматься обработкой загружаемых файлов. Скрытое поле MAX_FILE_SIZE должно предшествовать полю выбора файла, и содержать максимально допустимый размер файла в байтах. Его назначение — проверка размера файла еще до момента отправки файла на сервер. Это должно избавить пользователя от длительной и безрезультатной загрузки файла на сервер и образования лишнего трафика, но не стоит особо полагаться на это ограничение, так как его легко обойти.

Что происходит, когда пользователь выбрал файл на своем диске, и нажал на кнопку «Send file»? Браузер отсылает файл на сервер, где php-интерпретатор помещает его в свою временную директорию, присваивая ему случайное имя и выполняет скрипт, указанный в поле action.

Как должен выглядеть upload.php?

При написании скрипта, возникает естественный вопрос: как получить информацию о загруженном файле и достучаться до самого файла. Если Вы используете PHP версии 4.1.0 и старше, лучше всего будет обратиться к глобальному массиву $_FILES. Для каждого загруженного файла он содержит хеш-массив, со следующими данными:

  • $_FILES[‘userfile’][‘name’] — оригинальное имя файла, такое, каким его видел пользователь, выбирая файл;
  • $_FILES[‘userfile’][‘type’] — mime/type файла, к примеру, может быть image/gif; это поле полезно сохранить, если Вы хотите предоставлять интерфейс для скачивания загруженных файлов;
  • $_FILES[‘userfile’][‘size’] — размер загруженного файла;
  • $_FILES[‘userfile’][‘tmp_name’] — полный путь к временному файлу на диске;
  • $_FILES[‘userfile’][‘error’] — Начиная с версии 4.2.0, содержит код ошибки, который равен 0, если операция прошла успешно.

Для PHP версии ниже 4.1.0 этот массив называется $HTTP_POST_FILES. Не стоит забывать, что в отличие от $_FILES этот массив не является суперглобальным и при обращении к нему, к примеру, из функции, необходимо явно указывать global $HTTP_POST_FILES;

Если в настройках Вашего сервера register_globals=on, будут созданы дополнительные переменные вида $userfile_name, $userfile_type, $userfile_size… Учитывая, что, начиная с версии 4.2.0, в настройках по умолчанию register_globals=off использования этих переменных не рекомендовано, даже если они определены. Лучший способ получения информации о загружаемых файлах — использовать массив $_FILES.

Для работы с загруженными файлами лучше всего использовать встроенные функции is_uploaded_file() и move_uploaded_file(), которые проверяют, был ли загружен файл, и помещают его в указанную папку соответственно. Более детальную информацию Вы можете найти на страницах руководства. Не стоит изобретать велосипед и работать самому с временными файлами, копировать их, удалять. Это уже сделано до Вас и для Вас.

Настройка сервера

Я все сделал правильно, но у меня что-то не работает. Может, у меня неправильно сконфигурирован сервер?

Если Вы «все сделали правильно», но Ваш код неработает, или работает неправильно, не спешите отчаиваться. Возможно проблема не в Ваших руках, а в неверных настройках сервера. Вот список директив, которые имеют отношения к загрузке файлов:

В файле php.ini:

  • Если Вы хотите узнать, где расположен Ваш php.ini, выполните
  • file_uploads — возможность запретить или разрешить загрузку файлов в целом. По умолчанию On.
  • upload_max_filesize — максимальный размер файла, который может быть загружен. Если Вам необходимо работать с большими файлами, измените эту настройку. По умолчанию 2М. Не забудьте изменить post_max_size.
  • post_max_size — общее ограничение сверху на размер данных, передаваемых в POST запросе. Если Вам необходимо работать с большими файлами, или передавать несколько файлов одновременно, измените эту настройку. Значение по умолчанию 8М.
  • upload_tmp_dir — временная директория на сервере, в которую будут помещаться все загружаемые файлы. Проверьте, какие на нее выставлены права(если на данном этапе у Вас возникли сложности, смотрите пояснения в конце статьи). Такая директория должна существовать и у пользователя, под которым выполняется Apache, также должны быть права на запись в эту директорию. Если Вы работаете с включенным ограничением open_basedir — то временный каталог должен находиться внутри. Вам не нужно заботиться о ее чистке или об уникальности имен, PHP решает эту проблему за Вас.

В файле httpd.conf:

    Прежде всего, убедитесь, что Вы используете веб-сервер Apache 1.3 (последняя версия на момент написания статьи — 1.3.27). Если Вы используете Apache 2.0, Вам следует прочитать следующий отрывок из документации:

Do not use Apache 2.0 and PHP in a production environment neither on Unix nor on Windows.

  • Если Вы получили сообщение «POST Method Not Allowed», это означает, что надо искать что-то похожее на следующие директивы, и использовать ключевое слово Allow:
  • Проблемы с загрузкой бинарных файлов — классический вопрос «почему бьются файлы при upload». Вот способ решения, предложенный Димой Бородином (http://php.spb.ru): В директории, где лежит скрипт, делаем файл .htaccess, в котором пишем: В файл httpd.conf дописать строки:
  • Небольшие пояснения, к этому рецепту: вышеописанная проблема, когда загруженные на сервер архивы не распаковываются и картинки не отображаются, может возникать из-за того, что используется веб-сервер Russian Apache. Директива CharsetDisable отключает модуль charset-processing module, т.е. никакой перекодировки при скачивании файлов, находящихся в данной папке, происходить не будет. Директива CharsetRecodeMultipartForms выключает перекодировку данных, переданных методом POST с заголовком Content-Type: multipart/form-data. Т.е. двоичные данные, переданные с такой настройкой, будут оставлены в первоначальном виде, а все остальное наполнение сайта будет перекодировано согласно текущим настройкам сервера.

    Но при этом могут возникнуть осложнения: будьте готовы к тому, что в некоторых случаях текстовые части запросов вам придется перекодировать самостоятельно. Вот что по этому поводу говорится в документации:

    Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все-равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.

    Один из примеров определения кодировки вы можете найти тут: http://tony2001.phpclub.net/detect_charset/detect.phps

    Самая свежая документация по Russian Apache находится на его официальном сайте: http://apache.lexa.ru/.

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

    Также возможна настройка параметров Apach с помощью .htaccess:

    Дополнительные возможности

    Загрузка нескольких файлов одновременно

    Пример формы загрузки нескольких файлов:

    И не забудьте увеличить post_max_size, если предполагается много файлов

    Автоматическая загрузка файлов на сервер

    Не стоит забывать, что файлы на диске пользователя — конфиденциальная информация, к которой ни JavaScript, ни уж тем более PHP не имеют ни малейшего отношения. До тех пор, пока пользователь сам не выбрал файл при помощи ни о какой работе с ним не может идти и речи. И не забывайте, что у данного поля ввода атрибут value защищен от записи.

    Хранение файлов в базе данных mySQL

    Если Вы собрались хранить загружаемы файлы в базе данных, Вам необходимо помнить следующие моменты:

    • Необходимо использовать поле типа BLOB
    • Перед тем, как класть в базу, не забыть применить к строке mysql_escape_string()
    • При отображении файла необходимо указывать заголовок content/type

    Помните, что скрипт отображающий ваш HTML никак не связан со скриптом, который должен выводить изображение. Это должны быть два различные приложения.

    Читать еще:  Кабель менеджмент в системном блоке

    Хранение картинок в базе не является хорошем стилем. Гораздо удобней хранить в базе лишь пути к файлам изображений.

    Получение свойств изображения.

    Если перед вами возникла задача проверить тип или размеры картинки перед загрузкой файла на сервер, вам потребуется функция getimagesize(). В качестве аргумента она принимает имя файла на диске и возвращает массив, первые два элемента которого — ширина и высота соответственно, третий — тип изображения. В случае невозможности прочитать из указанного файла корректное изображение, функция возвращает ложь.

    Загрузка файлов, имеющих русско-язычное название

    При загрузке на сервер файлов, необходимо проверять их оригинальные имена на предмет наличия «нестандартных» символов (к примеру русских букв). В случае их присутствия необходимо произвести замену. Оригинальное имя файла можно найти в переменной $_FILES[‘userfile’][‘name’]. Как перекодировать русскоязычную строку в транслит можно можно найти в примерах PHP.

    Отображения статуса загрузки (Progress bar)

    Необходимо учитывать, что до полной загрузки файла, PHP не может оперировать ни размером файла, ни процентом его загрузки. Только когда файл уже находится на сервере PHP, то он получает возможность обращаться к информации. Если вам все-таки крайне необходимо реализовать такую возможность, воспользуйтесь Java-аплетом.

    Права на файлы

    Проблемы с правами на сервере (upload_tmp_dir)

    В Unix-подобных операционных системах каждой папке, файлу, ссылке выставлены соответствие права доступа. Они могут выглядеть как rwx-rw-r- или же как число 754.

    Доступность файла или каталога зависят от идентификатора пользователя и идентификатора группы, в которую он входит. Режим в целом описывается в терминах трех последовательностей, по три буквы в каждой:

    Здесь владелец, члены группы и все прочие пользователи обладают правами чтения файла, записи в него и его выполнения. Права — любая осмысленная комбинация следующих букв:

    r Право на чтение. (4)
    w Право на запись. (2)
    x Право на выполнение (поиск в каталоге). (1)

    Для того, что бы загрузка файлов на сервер работала корректно, необходимо реализовать один из двух вариантов

  • Установить владельцем каталога пользователя, с чьими привелегиями выполняется apache. Это можно узнать из файла httpd.conf или просмотрев список процессов на сервере. Права на каталог должны быть 700 (rwx——).
  • Независимо от того, кто является владельцем каталога, установить права 777 (rwxrwxrwx).

    Пример реализации загрузки картинок на сервер.

    Оригинал статьи находится на сайте PHP Club

    Upload файлов. Загрузка файлов на сервер. PHP

    В этом уроке мы с Вами поговорим о загрузке файлов на сервер с помощью возможностей php.

    Мы рассмотрим несколько вариантов загрузки файлов на сервер.

    Мы также рассмотрим проверку верного формата файла — то есть, если у Вас сайт с музыкой, то и форматы должны быть типа *.mp3, *.mp4, *.ogg, *.wma и т.д.

    И если пользователь захочет загрузить файл с неверным форматом, то мы ему этого не позволим.

    И так для начала нам потребуется форма для загрузки файла на сервер.

    В нашей форме появится одно новое поле, которое до этого мы не рассматривали — это поле file.

    Прописывается оно следующим образом:

    И так наша форма будет такой:

    Имя нашего поля с файлом — upfile.

    Для загрузки файла на сервер нужно сначала разобраться с директорией, в каторую Вы будете загружать файлы.

    У этой директории должны быть выставлены соответствующие права доступа ( chmod ) — 777

    Для изменения прав доступа можно воспользоваться Total Commander.

    В нём выделите нужную папку и в меню файл ( вроде так — первое меню ) выберите изменить атрибуты и в них проставьте все галочки.

    Теперь Ваша директория готова к загрузке файлов.

    Ещё один момент с вопросом по директориям:

    Если Вы будете тестировать скрипт на локальном сервере apache, который Вы поставили через denwer, то путь к папке будет таким — /home/SiteName/www/uploadfiles/

    А если Вы будете использовать этот скрипт в интернете, то просто пишите путь к Вашей папке, где будут храниться файлы, что-то вроде этого — /files/uploadfiles/

    И самое важное — в пути к директории в конце всегда ставьте знак слеша — / — так php сможет определить что это директория.

    Теперь перейдём к самому скрипту закачки файла на сервер:

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

    В нём есть несколько значений — для обозначения имени файла возьмём имя — upfile:

    1) $_FILES[«upfile»][«name»] — имя файла на компьютере пользователя — то есть, если пользователь загружал mymusic.mp3 — то имя — mymusic.mp3

    2) $_FILES[«upfile»][«tmp_name»] — полный путь к временому файлу на диске, в котором

    3) $_FILES[«upfile»][«size»] — размер файла в байтах

    4) $_FILES[«upfile»][«type»] — mime/type файла, например у нас файл — hello.jpg, то его mime/type — image/gif

    5) $_FILES[«upfile»][«error»] — код ошибки, работает с версии 4.2.0, если файл загружен успешно, то значение равняется 0

    Теперь применим все эти значения массива в скрипте:

    Пошаговое объяснения работы скрипта:

    1) Проверяем размер файла — если он превышает допустимый, то выдаём сообщение о ошибке

    2) При помощи функции — is_uploaded_file — проверяем загрузился ли файл во временную директорию

    3) Если нет, то выдаём сообщение о ошибке

    4) Если да, то при помощи функции — move_uploaded_file — перемещаем файл из временной директории в директорию для наших файлов

    5) Если успешно загружен, то выдаём соответствующее сообщение, иначе сообщение о ошибке

    Теперь поговорим о функциях использованных в этом коде:

    Функции is_uploaded_file в качестве значений передаётся полный путь к временной директории, и если эта функция находит этот файл во временной директории, то она возвращает true, то есть файл скопирован.

    Функции move_uploaded_file в качестве значений передаются путь к директории с временным файлом ( и именем файла ), и путь к директории, где хранятся остальные файлы ( с именем файла на компьютере пользователя, для загрузки файла на сервер именно с этим именем ).

    Если при проверке этого скрипта на сервере — происходит ошибка, то советуем посмотреть файл php.ini

    В нём можно настроить несколько параметров для работы скрипта:

    1) file_uploads — Этот параметр может запретить или разрешить загрузку файлов на сервер с помощью php — по умолчанию у него значение равняется On, если нет, то исправьте на On

    2) upload_max_filesize — Этот параметр обозначает максимальный размер загружаемого файла. По умолчанию его значение равняется 2М

    3) post_max_size — Этот параметр нужен для загрузки нескольких файлов одновременно — по умолчанию 8М

    4) upload_tmp_dir — Этот параметр обозначает временную директорию на сервере, куда будут сохранятся временные файлы

    Давайте рассмотрим загрузку нескольких файлов на сервер одновременно:

    Для этого достаточно прописать несколько полей с типом file, и с одинаковыми именами, после которых стоят квадратные скобки — [], будет что-то вроде таких имён — upfiles[]

    И конечно изменим код нашего скрипта — в котором в цикле просто нужно после всех значений глобального массива $_FILES в квадратных скобках дописать номер загружаемого файла. А так как эти номера начинаются с 0, то и если три поля, то номера будут идти до 2.

    И так вот код с описанием:

    Все функции die () мы заменили на echo, так как все файлы должны будут попытаться загрузиться на сервер, и если первый файл не сможет, то цикл не остановиться, а продолжит загружать остальные файлы.

    Также не стоит упускать момент с именем файлов.

    Читать еще:  Как сделать SSD основным диском для загрузки?

    Если имя файла на русском языке, то может произойти не предвиденная ошибка.

    Для устранения этой ошибки — Вы можете перевести имя файла в транслит.

    Для этого создайте массив со всеми заглавными и маленькими русскими буквами, и массив с транслитом для каждой буквы, если есть русские буквы, то воспользовавшись массивом с транслитом, Вы легко переведёте все буквы в английскую раскладку.

    Ну а теперь поговорим о форматах файлов.

    Для проверки формата файла — мы создадим массив. Пускай мы хотим загружать только изображения, то для форматов возьмём такой массив — $filetype = array ( ‘jpg’, ‘gif’, ‘png’, ‘jpeg’, ‘bmp’ );

    Теперь при помощи функции substr мы сможем занести в переменную тип файла. Для этого воспользуемся оригинальным именем файла — $_FILES[«upfile»][«name»].

    Тогда обрезание строки будет таким — $upfiletype = substr( $_FILES[‘upfile’][‘name’], strrpos( $_FILES[‘userfile’][‘name’], «.» ) + 1 );

    Почему мы приписали + 1 — потому что обрезаем всё по «.», а точка нам не нужна.

    И после мы просто проверяем есть ли тип файла в массиве при помощи функции in_array

    Блог Александра Денисюка

    В этой статье подробно разберём механизм загрузки изображений на сервер с помощью PHP не прибегая к сторонним компонентам и фреймворкам. Научимся безопасно загружать изображения не только с локальной машины пользователя, но и удалённые файлы по ссылке. Все примеры кода я буду писать в процедурном стиле, дабы вы быстрее могли читать код, а не перескакивать с одного метода на другой. Руководство полностью авторское и не претендует на какую-либо академичность изложения.

    §1. Общие принципы

    Всю последовательность загрузки изображения на сервер можно отобразить следующим образом: настройка php.iniполучение файлапроверка безопасностивалидация данныхсохранение на диск. Процесс загрузки картинки с компьютера пользователя или по URL ничем не отличаются, за исключением способа получения изображения и его сохранения. Общая схема загрузки картинки на сервер выглядит следующим образом:

    Для валидации картинки по URL мы будем использовать функцию getimagesizefromstring(), т. к. cURL скачает её в переменную для дальнейших манипуляций.

    Поскольку мы загружаем изображения на сервер, то хорошо было бы проверять их определённые параметры: ширину, высоту, тип картинки, размер файла в байтах. Это зависит от логики вашего приложения, но для наглядности в этом руководстве мы проверим все вышеописанные параметры.

    §2. Правила безопасности

    Безопасность загрузки изображений сводится к недопущению попадания на сервер чужеродного кода и его выполнения. На практике загрузка картинок наиболее уязвимое место в PHP-приложениях: попадание shell-скриптов, запись вредоносного кода в бинарные файлы, подмена EXIF-данных. Для того, чтобы избежать большинства методов взлома нужно придерживаться следующих правил:

    §3. Конфигурация php.ini

    PHP позволяет внести определённые конфигурационные значения в процесс загрузки любых файлов. Для этого необходимо в файле php.ini найти блоки «Resource Limits», «Data Handling» и «File Uploads», а затем отредактировать, по необходимости, следующие значения:

    Исходя из указанных значений, пользователь не сможет за один раз загрузить больше десяти файлов, причём каждый файл не должен превышать 5 Мбайт. Параметры из блока «Resource Limits» больше нужны для загрузки удалённого файла, т. к. с помощью cURL мы будем скачивать содержимое в переменную и проверять её по нужным нам критериям, а для этого необходимо дополнительное время и память.

    50 Мбайт памяти. Кроме того, нам нужно знать максимальное время загрузки одного файла с локальной машины и по ссылке, дабы установить достаточное время выполнения скрипта в max_execution_time и не пугать пользователей ошибками.

    §4. Загрузка картинок из формы

    Сейчас мы не будем рассматривать загрузку нескольких файлов на сервер, а разберём лишь саму механику загрузки на примере одного файла. Итак, для загрузки картинки с компьютера пользователя необходимо с помощью HTML-формы отправить файл PHP-скрипту методом POST и указать способ кодирования данных enctype=»multipart/form-data» (в данном случае данные не кодируются и это значение применяется только для отправки бинарных файлов). С формой ниже мы будем работать дальше:

    Для поля выбора файла мы используем имя name=»upload» в нашей HTML-форме, хотя оно может быть любым. После отправки файла PHP-скрипту file-handler.php его можно перехватить с помощью суперглобальной переменной $_FILES[‘upload’] с таким же именем, которая в массиве содержит информацию о файле:

    Не всем данным из $_FILES можно доверять: MIME-тип и размер файла можно подделать, т. к. они формируются из HTTP-ответа, а расширению в имени файла не стоит доверять в силу того, что за ним может скрываться совершенно другой файл. Тем не менее, дальше нам нужно проверить корректно ли загрузился наш файл и загрузился ли он вообще. Для этого необходимо проверить ошибки в $_FILES[‘upload’][‘error’] и удостовериться, что файл загружен методом POST с помощью функции is_uploaded_file(). Если что-то идёт не по плану, значит выводим ошибку на экран.

    Для того, чтобы злоумышленник не загрузил вредоносный код встроенный в изображение, нельзя доверять функции getimagesize(), которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo. Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

    На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize(), которой скормим сам бинарный файл $_FILES[‘upload’][‘tmp_name’]. В результате мы получим массив максимум из 7 элементов:

    Для дальнейшей валидации изображения и работы над ним нам необходиом знать только 3 значения: ширину, высоту и размер файла (для вычисления размера применим функцию filesize() для бинарного файла из временной папки).

    После всех проверок мы можем с уверенностью переместить наш загружаемый файл в какую-нибудь папку с картинками. Делать лучше это через функцию move_uploaded_file(), которая работает в безопасном режиме. Перед перемещением файла нельзя забыть сгенерировать случайное имя и расширение из типа изображения для нашего файла. Вот так это выглядит:

    На этом загрузка изображения завершена. Для более удобной загрузки файлов можете использовать класс UploadedFile из пакета Symfony HttpFoundation, который является обёрткой для $_FILES и также сохраняет файл через move_uploaded_file().

    §5. Загрузка изображения по ссылке

    Для загрузки изображения по ссылке нам понадобиться библиотека cURL, которая работает с удалёнными ресурсами. С помощью неё мы скачаем контент в переменную. С одной стороны может показаться, что для этих целей подойдёт file_get_contents(), но на самом деле мы не сможем контролировать объём скачиваемых данных и нормально обрабатывать все возникшие ошибки. Для того, чтобы cURL корректно скачал данные нам нужно: разрешить следовать перенаправлениям, включить проверку сертификата, указать максимальное время работы cURL (формируется за счёт объёма скачиваемых данных и средней скорости работы с ресурсом). Как правильно скачать файл в переменную показано ниже с необходимыми параметрами:

    Если всё прошло успешно и cURL уложился в 60 секунд, тогда содержимое по ссылке будет скачано в переменную $raw. Кроме того, функция curl_getinfo() вернёт информацию о проделанном запросе, откуда мы можем получить дополнительную информацию для анализа работы с удалёнными ресурсами:

    Дальше нам нужно проверить нет ли ошибок в curl_errno() и удостовериться, что ресурс отдаёт HTTP-код равный 200, иначе мы скажем, что по такому-то URL ничего не найдено. После всех проверок переменную $raw передаём в getimagesizefromstring() и работаем уже по отработанной схеме как в случае с загрузкой картинок из формы.

    Читать еще:  Забыл пароль от фейсбука как восстановить?[В[ОС]становление данных]

    Для сохранения изображения на диск можно воспользоваться file_put_contents(), которая запишет контент в файл. Новое имя файла мы создадим через функцию md5(), а расширение сделаем из image_type_to_extension(). Теперь мы можем загружать любые картинки по ссылке.

    §6. Настройка выбора нескольких файлов

    В этом параграфе разберём способы загрузки нескольких изображений за один раз с локальной машины пользователя и по удалённым ссылкам. Для отправки ссылок мы задействуем $_POST и передадим ей все данные с помощью тега textarea. Для загрузки файлов из формы мы продолжим дальше работать с $_FILES. Наша новая HTML-форма будет немного отличаться от старой.

    В конец имени поля выбора файла name=»upload[]» добавились фигурные скобки и аттрибут multiple, который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES, но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

    Для загрузки нескольких картинок по URL передадим наши ссылки через textarea с именем name=»upload», где их можно указать через пробел или с новой строки. Функция preg_split разберёт все данные из $_POST[‘upload’] и сформирует массив, по которому нужно пройтись циклом и каждый валидный URL отправить в обработчик.

    Вы можете улучшить форму для загрузки изображений, например, воспользоваться библиотекой FineUploader или jQuery FileUpload, чтобы настроить выбор картинок с определённым расширением.

    Ajax загрузка нескольких файлов на сервер

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

    Да этот способ можно назвать «AJAX загрузка файлов на сервер», хотя он и не использует ни ActiveXObject ни XMLHttpRequest, тем не менее это то, что в последствии превратилось в AJAX. Вообще, здесь я раскрою несколько трюков разработки, которые будут довольно неплохой находкой для начинающих.

    Во первых метод использует динамически добавляемые/удаляемые поля загрузки файлов ( листинг JavaScript прилагается ) — т.е. в данной заметке рассматривается загрузка и обработка неопределённого множества файлов на сервер, и как всегда я стараюсь писать как можно лаконичнее и понятнее.

    Во вторых, конечно всё будет происходить, именно без перезагрузки страницы.

    В третьих будет дан серверный скрипт, который принимает данные, выводит информацию, и обрабатывает ошибки загрузки файлов

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

    Как мы уже знаем, при написании html форм атрибуты «name» — элементов формы, впоследствии являются ключами глобальных массивов: $_REQUEST $_GET или $_POST и если в форме будут два поля с одинаковым атрибутом «name» то значение последнего поля «затрёт» значения предыдущих в глобальном массиве. Т.е. если у нас есть следующее:

    То в обрабатывающем скрипте ма увидим массив $_FILES, котором будет только один ключ «upfile», а значение первого поля с id=»one» — затрётся.

    Решается такая проблема банально просто: даём разные имена атрибутам «name» и «id». Но! Что делать, если поля для загрузки файлов должны добавляться динамически, и их количество заранее не известно? Как правило программисты предпочитают генерировать подобные вещи в цикле, добавляя к атрибуту «name» некий числовой суффикс, добиваясь тем самым уникальности атрибута «name», а атрибут id за редким исключением почти всегда можно опустить ( Вспоминаем методы DOM для доступа к элементам ) Серверный скрипт генерации формы может иметь следующий вид:

    Код выше сгенерит нам 50 полей для загрузки файлов и у каждого элемента атрибут «name» будет иметь уникальный суффикс: _n — номер итерации цикла. Получим мы следующий html код:

    Теперь все эти поля благополучно свалятся на сервер, и всем будет хорошо. но не очень. Здесь нет динамического добавления/удаления полей загрузки файлов. а так хотелось.

    Альтернативный вариант решения этой задачи в том, что бы не использовать генерацию формы на сервере, а озадачить этим браузер клиента. И что бы избежать лишнего цикла при создании полей мы не будем добавлять индекс к атрибуту «name», а сделаем этот тип данных не строкой, как по — умолчанию, а массивом. Да — да вспоминаем, что передевать методами GET и POST мы можем и массивы! Теперь атрибут «name» имеет следующий вид : name=»file[]» (Название file — здесь я придумал сам ну, мы же файлы собрались передавать.) То есть тут нам нужен — его величество JavaScript (можно конечно и VBScript, и много чего ещё, но я знаю только JavaScript) Вот пример скрипта. Помещаем его куда угодно на странице ( Товарищи малознакомые с JS — не пугаемся там как всегда больше комментариев)

    Скрипт для динамичной html формы

    А вот структура самой html формы без дополнительных телодвижений на сервере:

    Не забываем указывать enctype=»multipart/form-data» для формы!

    А то потом долго будем гадать почему массив $_FILES пустой!

    Здесь мы видим интересную «фишку» : если атрибуту target — формы передать имя фрейма (который идет ниже по коду), то при отправке формы перезагрузки страницы не произойдёт! Но во фрейме мы увидим результат работы серверного скрипта! Вспоминаем, что «есть такое» атрибут target:

    Это имя окна или фрейма, куда обработчик события onsubmit будет загружать возвращаемый результат.

    Собственно этот интересный эффект мы и пронаблюдаем с вами в конце. Ну, а с интерфейсом формы надеюсь всё понятно — можно добавить поле загрузки файлов, а можно удалить. итак до бесконечности.

    Имейте ввиду!

    Если где то в html коде формы, или фрейма будут синтаксические или другие ошибки IE — вам не простит! Он будет окрывать новое окно для отображения результатов загрузки или будет чудить иным образом. Если вы наблюдаете эту ситуацию внимательно проверьте html код клиентской части.

    Настало время серверной стороны дела. Если мы к примеру загрузили 3 файла, то на сервере, при трассировке массива $_FILES мы увидим следующую картину:

    По сути в массиве $_FILES мы теперь имеем массив [file] ключи которого так же являются массивами. Его то нам и нужно разобрать:

    Ключ [name] — имена загруженных файлов.

    Ключ [type] — типы MIME загруженных файлов.

    Ключ [tmp_name] — путь к файлам куда они складываются на сервере * .

    Ключ [error] — коды ошибок загрузки файлов * .

    Ключ [size] — размеры файлов.

    * — файлы при загрузке, сначала попадают в директорию, прописанную в файле php.ini, как значение директивы upload_tmp_dir ( как правило это папка tmp/ по умолчанию, она должна иметь соответствующие права на запись). Наша задача переместить их оттуда, туда, куда нам нужно.

    * Значения ошибок загрузки файлов

    Серверный скрипт для обработки загрузки неопределённого множества файлов

    Тут я надеюсь всё понятно — я вроде старался комментировать, но если что не ясно пишем в комменты.

    Здесь стоит особо отметить для шустрых товарищей, которые уже успели скопировать код cкриптов — Как было сказано скрипты рабочие, НО! Здесь опущен какой либо функционал, обеспечивающий безопасность! Добавить нужные проверки не трудно, но это уже к теме не относиться. И. должен же я оставить и вам возможность подумать 🙂

  • Ссылка на основную публикацию
    Adblock
    detector