Софт-Архив

Filez

Рейтинг: 4.1/5.0 (1480 проголосовавших)

Категория: Windows: FTP, SSH, Telnet

Описание

PHP и HTTP

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

Multipart-формы

Загрузка фаилов на сервер осуществляется пользователями сети интернет довольно часто, а именно:

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

Загрузка файла на сервер осуществляется с помощью multipart -формы, в которой есть поле загрузки файла. В качестве параметра enctype указывается значение multipart/form-data :

<form action=upload.php method=post enctype=multipart/form-data>

<input type=file name=uploadfile>

<input type=submit value=Загрузить></form>

Вот так примерно будет выглядеть приведенная multipart-форма (вы можете попробовать с ее помощью посмотреть результат работы multipart-форм, загрузив какой-нибудь файл небольшого размера на сервер):

Multipart-формы обычно используют метод передачи POST. Как видно из предыдущего примера, данная форма имеет два поля:

    Поле выбора файла для закачки <INPUT type=File> ; Поле указания имени файла, которое он должен будет иметь на сервере <INPUT type=text> .

Обработка multipart-форм

Прежде, чем приступить к написанию скрипта обработки multipart-формы, нужно отредактировать файл конфигурации php.ini . чтобы разрешить загрузку файлов на сервер.

Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер:

    file_uploads=On - разрешает загрузку файлов на сервер по протоколу HTTP; upload_tmp_dir=/tmp - устанавливает каталог для временного хранения загруженных файлов; upload_max_filesize=2M - устанавливает максимальный объем загружаемых файлов.

Если ваш веб-сервер работает под управлением операционной системы Linux, то нужно перезапустить сервис:

service httpd restart

Как же PHP обрабатывает multipart-формы? Получив файл, он сохраняет его во временном каталоге upload_tmp_dir. имя файла выбирается случайным образом. Затем он создает четыре переменных суперглобального массива $_FILES. Этот массив содержит информацию о загруженном файле.

Переменные, определенные для загруженных файлов, зависят от версии PHP и текущей конфигурации. Суперглобальный массив $_FILES доступен начиная с PHP 4.1.0. В случае, если конфигурационная директива register_globals установлена значением on. дополнительно будут объявлены переменные с соответствующими именами. Начиная с версии 4.2.0 значением по умолчанию для опции register_globals является off .

Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что здесь предполагается использование имени uploadfile для поля выбора файла, в соответствии с приведенной выше multipart-форме. Разумеется, имя поля может быть любым.

    $_FILES['uploadfile']['name'] - имя файла до его отправки на сервер, например, pict.gif;

$_FILES['uploadfile']['size'] - размер принятого файла в байтах;

$_FILES['uploadfile']['type'] - MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html;

$_FILES['uploadfile']['tmp_name'] (так мы назвали поле загрузки файла) - содержит имя файла во временном каталоге, например: /tmp/phpV3b3qY;

$_FILES['uploadfile']['error'] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ['error'] был добавлен в PHP 4.2.0. С соответствующими кодами ошибок вы можете ознакомиться здесь

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

Если кнопка "Submit" нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES['uploadfile']['name']. В этом случае скрипт должен сразу скопировать файл с именем $_FILES['uploadfile']['tmp_name'] в какой-нибудь каталог (необходимы права на запись в этот каталог).

Копирование файла производится функцией copy() :

Используйте только функцию копирования copy(). а не перемещения, поскольку:

    Временный файл будет удален автоматически; Если временный каталог находится на другом носителе, будет выведено сообщение об ошибке.

Предположим, нам нужно загрузить файл в каталог uploads. который находится в корневом каталоге веб-сервера (в каталоге DocumentRoot ).

// На всякий случай создадим каталог. Если он уже создан,

// сообщение об ошибки мы не увидим, поскольку воспользуемся оператором @:

@mkdir("uploads", 0777);

// Копируем файл из /tmp в uploads

// Имя файла будет таким же, как и до отправки на сервер:

copy($_FILES['uploadfile']['tmp_name'],"uploads/".basename($_FILES['uploadfile']['name']));

В Linux все намного сложнее - нам нужно учитывать права доступа к каталогу uploads. Скорее всего в таком случае, функция mkdir() не сработает, так как у нас нет прав на запись в каталог DocumentRoot (обычно это /var/www/html или /home/httpd/html). Зарегистрируйтесь в системе как пользователь root. создайте каталог uploads и измените его владельца и права доступа следующим образом:

// Создаем каталог uploads

mkdir uploads

// Устанавливаем имя владельца apache и его группу - тоже apache:

chown apache:apache uploads

// Разрешение записи всем (777) + установка закрепляющего бита (1):

chmod 1777 uploads

Размер файла можно ограничить, при желании можно отредактировать файл .htaccess и ограничить доступ к каталогу uploads - указать или конкретных пользователей, которым можно обращаться к каталогу, или IP-адреса.

Вот теперь можно загружать файлы на сервер.

Пишем PHP скрипт загрузки файлов на сервер

$ uploadfile = $ uploaddir. basename ($ _FILES [ 'uploadfile' ][ 'name' ]);

// Копируем файл из каталога для временного хранения файлов:

if ( copy ($ _FILES [ 'uploadfile' ][ 'tmp_name' ], $ uploadfile ))

echo "<h3>Файл успешно загружен на сервер</h3>" ;

// Выводим информацию о загруженном файле:

echo "<h3>Информация о загруженном на сервер файле: </h3>" ;

echo "<p><b>Оригинальное имя загруженного файла: " .$ _FILES [ 'uploadfile' ][ 'name' ]. "</b></p>" ;

echo "<p><b>Mime-тип загруженного файла: " .$ _FILES [ 'uploadfile' ][ 'type' ]. "</b></p>" ;

echo "<p><b>Размер загруженного файла в байтах: " .$ _FILES [ 'uploadfile' ][ 'size' ]. "</b></p>" ;

echo "<p><b>Временное имя файла: " .$ _FILES [ 'uploadfile' ][ 'tmp_name' ]. "</b></p>" ;

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

Загрузку нескольких файлов можно реализовать используя, например, различные значения name для тега input .

Также предусмотрена возможность автоматического получения организованной в массив информации о нескольких одновременно загружаемых файлах. Для реализации такой возможности используйте тот же синтаксис отправки массива из HTML-формы, что и для множественных полей select и checkbox :

<form action="upload.php" method="post" enctype="multipart/form-data">

Send these files:<br>

<input name="userfile[]" type="file"><br>

<input name="userfile[]" type="file"><br>

<input type="submit" value="Отправить файлы ">

</form>

В случае, если такая форма была отправлена, массивы $_FILES['userfile']. $_FILES['userfile']['name']. и $_FILES['userfile']['size'] будут инициализированы (точно так же, как и $HTTP_POST_FILES для PHP 4.1.0 и более ранних версий). Если конфигурационная директива register_globals установлена значением on. также будут инициализированы сопутствующие глобальные переменные. Каждая из таких переменных будет представлять собой численно индексированный массив соответствующих значений для принятых файлов.

Предположим, что были загружены файлы /home/test/some.html и /home/test/file.bin. В таком случае переменная $_FILES['userfile']['name'][0] будет иметь значение some.html. а переменная $_FILES['userfile']['name'][1] - значение file.bin. Аналогично, переменная $_FILES['userfile']['size'][0] будет содержать размер файла some.html и так далее.

Переменные $_FILES['userfile']['name'][0]. $_FILES['userfile']['tmp_name'][0]. $_FILES['userfile']['size'][0] и $_FILES['userfile']['type'][0] также будут инициализированы.

Заключение:

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

Filez:

  • скачать
  • скачать
  • Другие статьи, обзоры программ, новости

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

    Пример загрузки файлов на сервер (upload) на языке php

    Приложение для загрузки файлов на сервер представляет собой HTML-форму (upload.html) и скрипт upload.php для ее обработки.

    Замечание: Вы можете загрузить промышленную версию системы загрузки файлов на сервер из раздела downloads. Система Image Java Editor позволит вам не только загрузить файл на сервер, но и изменить его размер, фон и др.

    Код формы (upload.html)

    Код скрипта обработки формы (upload.php)

    Атрибут entype формы определяет вид кодировки, которую браузер применяет к параметрам формы. Для того чтобы отправка файлов на сервер действовала, атрибуту entype необходимо присвоить значение multipart/form-data. По умолчанию этот атрибут имеет значение application/x-www-form-urlencoded.

    Элемент ввода этой формы должен иметь тип file.

    После того, как получен HTTP-запрос, содержимое загруженного файла записывается во временный файл, который создается в каталоге сервера, заданном по умолчанию для временных файлов, если другой каталог не задан в файле php.ini (директива upload_tmp_dir).

    Характеристики загруженного файла доступны через двумерный массив $_FILES.

    Cкрипт upload.php загружает файл на сервер и копирует его в каталог /path/to/file/.

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

    Максимальный размер загружаемого файла можно также задать при помощи директивы upload_max_filesize, значение которой по умолчанию равно 2 Мбайт:

    FILES - глобальный массив с информацией о загруженных на сервер файлах

    Суперглобальный массив $_FILES Для каждого загруженного файла массив $_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 загрузка файла коды ошибок

    UPLOAD_ERR_OK

    Значение: 0; Ошибок не возникало, файл был успешно загружен на сервер.

    UPLOAD_ERR_INI_SIZE

    Значение: 1; Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini .

    UPLOAD_ERR_FORM_SIZE

    Значение: 2; Размер загружаемого файла превысил значение MAX_FILE_SIZE. указанное в HTML-форме.

    UPLOAD_ERR_PARTIAL Значение: 3; Загружаемый файл был получен только частично. UPLOAD_ERR_NO_FILE Значение: 4; Файл не был загружен. UPLOAD_ERR_NO_TMP_DIR

    Значение: 6; отсутствует временная папка.

    UPLOAD_ERR_CANT_WRITE

    Value: 7; Failed to write file to disk. Introduced in PHP 5.1.0.

    UPLOAD_ERR_EXTENSION

    Value: 8; A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0.

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

    PHP основы: Загрузка файлов

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

    Практически в каждом проекте разработчик сталкивается с необходимостью загрузки файлов на сервер. Фотографии, картинки, документы, архивы и многое другое может быть загружено на сервер посредством web-интерфейса (через браузер).

    Загрузка данных на сервер может происходить одним из двух методов: GET или POST. Метод GET подразумевает, что все параметры передаются в строке URL. Например, строка:

    определяет запрос GET к странице index.php. При этом скрипту передаются параметры "name" и "page" со значениями "myname" и "10" соответственно. Как видите, запрос состоит из пар "имя=значение", объединённых через "&". Запрос отделяется от адреса страницы знаком вопроса "?".

    Но GET не подходит для передачи больших данных. Для этого существует метод POST. Этот метод передаёт данные скрыто от пользователя, а адрес страницы остаётся неизменным. Теоретически, метод POST позволяет передавать огромные блоки данных, но большинство провайдеров устанавливают жесткое ограничение в 5-10 мегабайт.

    Для реализации загрузки файла необходимо снабдить пользователя соответствующей формой. Для загрузки файлов предназначен тег input типа file.

    Пользователь выбирает нужный файл, нажимает кнопку "Отправить!", после чего браузер передаёт указанный файл на сервер. По окончании загрузки файла запускается receiver.php, и ему автоматически становятся доступны все переданные в форме данные.

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

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

    Информация о каждом загруженном файле представляется в скрипте как элемены массива $_FILES. Имя элемента определяется атрибутом name тега формы. В нашем случае атрибут name равен "ufile", значит данные об этом файле будут храниться в элементе $_FILES['ufile'].

    Каждый элемент $_FILES так же является массивом, содержащим пять элементов с фиксированными именами:

    $_FILES['ufile']['name']

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

    Upload файлов, и все с этим связанное

    Краткий эксурс в upload

    Что такое Upload files, или почему не работает

    copy ("c:\images\sample.jpg", "c:\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://www.php.net/downloads.php) этот массив называется $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, в котором пишем: CharsetDisable On. В файл 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/.

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

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

    Я хочу сделать вот такую штуку, но у меня никак не получается.

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

    На самом деле в этом нет никакой трудности. Этого можно достичь, используя, к примеру, вот такую форму:

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

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

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

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

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

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

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

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

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

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

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

    Отображения статуса загрузки или progress bar

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

    Краткий очерк о правах на файлы

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

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

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

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

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

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

    Еще один прмер реализации, с использованием PEAR (подсказан kvn-ом). Оригинальный пакет находится по адресу: http://pear.php.net/packages/HTTP_Upload

    <html><body> <form action="<?php echo $HTTP_SERVER_VARS['PHP_SELF'];?>?submit=1" method="post" enctype="multipart/form-data"> Send these files:<br> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="100000"> <input name="userfile" type="file"> <-<br> <input name="otherfile[]" type="file"><br> <input name="otherfile[]" type="file"><br> <input type="submit" value="Send files"> </form> </body></html> <?php error_reporting(E_ALL); if (!isset($submit)) < exit; > require 'HTTP/Upload.php'; echo '<pre>'; //print_r($HTTP_POST_FILES); $upload = new http_upload('es'); $file = $upload->getFiles('userfile'); if (PEAR::isError($file)) < die ($file->getMessage()); > if ($file->isValid()) < $file->setName('uniq'); $dest_dir = './uploads/'; $dest_name = $file->moveTo($dest_dir); if (PEAR::isError($dest_name)) < die ($dest_name->getMessage()); > $real = $file->getProp('real'); echo "Uploaded $real as $dest_name in $dest_dir\n"; > elseif ($file->isMissing()) < echo "No file selected\n"; > elseif ($file->isError()) < echo $file->errorMsg(). "\n"; > print_r($file->getProp()); echo '</pre>'; ?>

  • PHP: $_FILES

    $HTTP_POST_FILES [устаревшее]

    (PHP 4 >= 4.1.0, PHP 5, PHP 7)

    $_FILES -- $HTTP_POST_FILES [устаревшее] — Переменные файлов, загруженных по HTTP

    Ассоциативный массив ( array ) элементов, загруженных в текущий скрипт через метод HTTP POST.

    User Contributed Notes 26 notes

    The format of this array is (assuming your form has two input type=file fields named "file1", "file2", etc):

    [file1] => Array

    [name] => MyFile.txt (comes from the browser, so treat as tainted)

    [type] => text/plain (not sure where it gets this from - assume the browser, so treat as tainted)

    [tmp_name] => /tmp/php/php1h4j1o (could be anywhere on your system, depending on your config settings, but the user has no control, so this isn't tainted)

    [error] => UPLOAD_ERR_OK (= 0)

    [size] => 123 (the size in bytes)

    [name] => MyFile.jpg

    [type] => image/jpeg

    [tmp_name] => /tmp/php/php6hst32

    Files (Java Platform SE 8 )

    newByteChannel

    Opens or creates a file, returning a seekable byte channel to access the file.

    This method opens or creates a file in exactly the manner specified by the newByteChannel method.

    newDirectoryStream

    Opens a directory, returning a DirectoryStream to iterate over all entries in the directory. The elements returned by the directory stream's iterator are of type Path. each one representing an entry in the directory. The Path objects are obtained as if by resolving the name of the directory entry against dir.

    When not using the try-with-resources construct, then directory stream's close method should be invoked after iteration is completed so as to free any resources held for the open directory.

    When an implementation supports operations on entries in the directory that execute in a race-free manner then the returned directory stream is a SecureDirectoryStream .

    Parameters: dir - the path to the directory Returns: a new and open DirectoryStream object Throws: NotDirectoryException - if the file could not otherwise be opened because it is not a directory (optional specific exception) IOException - if an I/O error occurs SecurityException - In the case of the default provider, and a security manager is installed, the checkRead method is invoked to check read access to the directory.
      newDirectoryStream

      Opens a directory, returning a DirectoryStream to iterate over the entries in the directory. The elements returned by the directory stream's iterator are of type Path. each one representing an entry in the directory. The Path objects are obtained as if by resolving the name of the directory entry against dir. The entries returned by the iterator are filtered by matching the String representation of their file names against the given globbing pattern.

      For example, suppose we want to iterate over the files ending with ".java" in a directory:

      The globbing pattern is specified by the getPathMatcher method.

      When not using the try-with-resources construct, then directory stream's close method should be invoked after iteration is completed so as to free any resources held for the open directory.

      When an implementation supports operations on entries in the directory that execute in a race-free manner then the returned directory stream is a SecureDirectoryStream .

      Parameters: dir - the path to the directory glob - the glob pattern Returns: a new and open DirectoryStream object Throws: PatternSyntaxException - if the pattern is invalid NotDirectoryException - if the file could not otherwise be opened because it is not a directory (optional specific exception) IOException - if an I/O error occurs SecurityException - In the case of the default provider, and a security manager is installed, the checkRead method is invoked to check read access to the directory.
      newDirectoryStream

      Opens a directory, returning a DirectoryStream to iterate over the entries in the directory. The elements returned by the directory stream's iterator are of type Path. each one representing an entry in the directory. The Path objects are obtained as if by resolving the name of the directory entry against dir. The entries returned by the iterator are filtered by the given filter.

      When not using the try-with-resources construct, then directory stream's close method should be invoked after iteration is completed so as to free any resources held for the open directory.

      Where the filter terminates due to an uncaught error or runtime exception then it is propagated to the hasNext or next method. Where an IOException is thrown, it results in the hasNext or next method throwing a DirectoryIteratorException with the IOException as the cause.

      When an implementation supports operations on entries in the directory that execute in a race-free manner then the returned directory stream is a SecureDirectoryStream.

      Usage Example: Suppose we want to iterate over the files in a directory that are larger than 8K.

      Parameters: dir - the path to the directory filter - the directory stream filter Returns: a new and open DirectoryStream object Throws: NotDirectoryException - if the file could not otherwise be opened because it is not a directory (optional specific exception) IOException - if an I/O error occurs SecurityException - In the case of the default provider, and a security manager is installed, the checkRead method is invoked to check read access to the directory.
      createFile

      Creates a new and empty file, failing if the file already exists. The check for the existence of the file and the creation of the new file if it does not exist are a single operation that is atomic with respect to all other filesystem activities that might affect the directory.

      The attrs parameter is optional file-attributes to set atomically when creating the file. Each attribute is identified by its name. If more than one attribute of the same name is included in the array then all but the last occurrence is ignored.

      Parameters: path - the path to the file to create attrs - an optional list of file attributes to set atomically when creating the file Returns: the file Throws: UnsupportedOperationException - if the array contains an attribute that cannot be set atomically when creating the file FileAlreadyExistsException - if a file of that name already exists (optional specific exception) IOException - if an I/O error occurs or the parent directory does not exist SecurityException - In the case of the default provider, and a security manager is installed, the checkWrite method is invoked to check write access to the new file.
      createDirectory

      Creates a new directory. The check for the existence of the file and the creation of the directory if it does not exist are a single operation that is atomic with respect to all other filesystem activities that might affect the directory. The createDirectories method should be used where it is required to create all nonexistent parent directories first.

      The attrs parameter is optional file-attributes to set atomically when creating the directory. Each attribute is identified by its name. If more than one attribute of the same name is included in the array then all but the last occurrence is ignored.

      createDirectories

      Creates a directory by creating all nonexistent parent directories first. Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists.

      The attrs parameter is optional file-attributes to set atomically when creating the nonexistent directories. Each file attribute is identified by its name. If more than one attribute of the same name is included in the array then all but the last occurrence is ignored.

      If this method fails, then it may do so after creating some, but not all, of the parent directories.

      Parameters: dir - the directory to create attrs - an optional list of file attributes to set atomically when creating the directory Returns: the directory Throws: UnsupportedOperationException - if the array contains an attribute that cannot be set atomically when creating the directory FileAlreadyExistsException - if dir exists but is not a directory (optional specific exception) IOException - if an I/O error occurs SecurityException - in the case of the default provider, and a security manager is installed, the checkWrite method is invoked prior to attempting to create a directory and its checkRead is invoked for each parent directory that is checked. If dir is not an absolute path then its toAbsolutePath may need to be invoked to get its absolute path. This may invoke the security manager's checkPropertyAccess method to check access to the system property user.dir
      createTempFile

      Creates a new empty file in the specified directory, using the given prefix and suffix strings to generate its name. The resulting Path is associated with the same FileSystem as the given directory.

      The details as to how the name of the file is constructed is implementation dependent and therefore not specified. Where possible the prefix and suffix are used to construct candidate names in the same manner as the File.createTempFile(String,String,File) method.

      As with the File.createTempFile methods, this method is only part of a temporary-file facility. Where used as a work files. the resulting file may be opened using the DELETE_ON_CLOSE option so that the file is deleted when the appropriate close method is invoked. Alternatively, a shutdown-hook. or the File.deleteOnExit() mechanism may be used to delete the file automatically.

      The attrs parameter is optional file-attributes to set atomically when creating the file. Each attribute is identified by its name. If more than one attribute of the same name is included in the array then all but the last occurrence is ignored. When no file attributes are specified, then the resulting file may have more restrictive access permissions to files created by the File.createTempFile(String,String,File) method.

      Parameters: dir - the path to directory in which to create the file prefix - the prefix string to be used in generating the file's name; may be null suffix - the suffix string to be used in generating the file's name; may be null. in which case " .tmp " is used attrs - an optional list of file attributes to set atomically when creating the file Returns: the path to the newly created file that did not exist before this method was invoked Throws: IllegalArgumentException - if the prefix or suffix parameters cannot be used to generate a candidate file name UnsupportedOperationException - if the array contains an attribute that cannot be set atomically when creating the directory IOException - if an I/O error occurs or dir does not exist SecurityException - In the case of the default provider, and a security manager is installed, the checkWrite method is invoked to check write access to the file.
      createTempFile

      Creates an empty file in the default temporary-file directory, using the given prefix and suffix to generate its name. The resulting Path is associated with the default FileSystem.

      This method works in exactly the manner specified by the createTempFile(Path,String,String,FileAttribute[]) method for the case that the dir parameter is the temporary-file directory.

      Parameters: prefix - the prefix string to be used in generating the file's name; may be null suffix - the suffix string to be used in generating the file's name; may be null. in which case " .tmp " is used attrs - an optional list of file attributes to set atomically when creating the file Returns: the path to the newly created file that did not exist before this method was invoked Throws: IllegalArgumentException - if the prefix or suffix parameters cannot be used to generate a candidate file name UnsupportedOperationException - if the array contains an attribute that cannot be set atomically when creating the directory IOException - if an I/O error occurs or the temporary-file directory does not exist SecurityException - In the case of the default provider, and a security manager is installed, the checkWrite method is invoked to check write access to the file.
      createTempDirectory

      Creates a new directory in the specified directory, using the given prefix to generate its name. The resulting Path is associated with the same FileSystem as the given directory.

      The details as to how the name of the directory is constructed is implementation dependent and therefore not specified. Where possible the prefix is used to construct candidate names.

      As with the createTempFile methods, this method is only part of a temporary-file facility. A shutdown-hook. or the File.deleteOnExit() mechanism may be used to delete the directory automatically.

      The attrs parameter is optional file-attributes to set atomically when creating the directory. Each attribute is identified by its name. If more than one attribute of the same name is included in the array then all but the last occurrence is ignored.

      Parameters: dir - the path to directory in which to create the directory prefix - the prefix string to be used in generating the directory's name; may be null attrs - an optional list of file attributes to set atomically when creating the directory Returns: the path to the newly created directory that did not exist before this method was invoked Throws: IllegalArgumentException - if the prefix cannot be used to generate a candidate directory name UnsupportedOperationException - if the array contains an attribute that cannot be set atomically when creating the directory IOException - if an I/O error occurs or dir does not exist SecurityException - In the case of the default provider, and a security manager is installed, the checkWrite method is invoked to check write access when creating the directory.
      createTempDirectory

      Creates a new directory in the default temporary-file directory, using the given prefix to generate its name. The resulting Path is associated with the default FileSystem.

      This method works in exactly the manner specified by createTempDirectory(Path,String,FileAttribute[]) method for the case that the dir parameter is the temporary-file directory.

      Parameters: prefix - the prefix string to be used in generating the directory's name; may be null attrs - an optional list of file attributes to set atomically when creating the directory Returns: the path to the newly created directory that did not exist before this method was invoked Throws: IllegalArgumentException - if the prefix cannot be used to generate a candidate directory name UnsupportedOperationException - if the array contains an attribute that cannot be set atomically when creating the directory IOException - if an I/O error occurs or the temporary-file directory does not exist SecurityException - In the case of the default provider, and a security manager is installed, the checkWrite method is invoked to check write access when creating the directory.
      createSymbolicLink

      Creates a symbolic link to a target (optional operation).

      The target parameter is the target of the link. It may be an absolute or relative path and may not exist. When the target is a relative path then file system operations on the resulting link are relative to the path of the link.

      The attrs parameter is optional attributes to set atomically when creating the link. Each attribute is identified by its name. If more than one attribute of the same name is included in the array then all but the last occurrence is ignored.

      Where symbolic links are supported, but the underlying FileStore does not support symbolic links, then this may fail with an IOException. Additionally, some operating systems may require that the Java virtual machine be started with implementation specific privileges to create symbolic links, in which case this method may throw IOException .

      Parameters: link - the path of the symbolic link to create target - the target of the symbolic link attrs - the array of attributes to set atomically when creating the symbolic link Returns: the path to the symbolic link Throws: UnsupportedOperationException - if the implementation does not support symbolic links or the array contains an attribute that cannot be set atomically when creating the symbolic link FileAlreadyExistsException - if a file with the name already exists (optional specific exception) IOException - if an I/O error occurs SecurityException - In the case of the default provider, and a security manager is installed, it denies LinkPermission ("symbolic") or its checkWrite method denies write access to the path of the symbolic link.
      createLink

      Creates a new link (directory entry) for an existing file (optional operation).

      The link parameter locates the directory entry to create. The existing parameter is the path to an existing file. This method creates a new directory entry for the file so that it can be accessed using link as the path. On some file systems this is known as creating a "hard link". Whether the file attributes are maintained for the file or for each directory entry is file system specific and therefore not specified. Typically, a file system requires that all links (directory entries) for a file be on the same file system. Furthermore, on some platforms, the Java virtual machine may require to be started with implementation specific privileges to create hard links or to create links to directories.

      Parameters: link - the link (directory entry) to create existing - a path to an existing file Returns: the path to the link (directory entry) Throws: UnsupportedOperationException - if the implementation does not support adding an existing file to a directory FileAlreadyExistsException - if the entry could not otherwise be created because a file of that name already exists (optional specific exception) IOException - if an I/O error occurs SecurityException - In the case of the default provider, and a security manager is installed, it denies LinkPermission ("hard") or its checkWrite method denies write access to either the link or the existing file.

      Deletes a file.

      An implementation may require to examine the file to determine if the file is a directory. Consequently this method may not be atomic with respect to other file system operations. If the file is a symbolic link then the symbolic link itself, not the final target of the link, is deleted.

      If the file is a directory then the directory must be empty. In some implementations a directory has entries for special files or links that are created when the directory is created. In such implementations a directory is considered empty when only the special entries exist. This method can be used with the walkFileTree method to delete a directory and all entries in the directory, or an entire file-tree where required.

      On some operating systems it may not be possible to remove a file when it is open and in use by this Java virtual machine or other programs.

      Parameters: path - the path to the file to delete Throws: NoSuchFileException - if the file does not exist (optional specific exception) DirectoryNotEmptyException - if the file is a directory and could not otherwise be deleted because the directory is not empty (optional specific exception) IOException - if an I/O error occurs SecurityException - In the case of the default provider, and a security manager is installed, the SecurityManager.checkDelete(String) method is invoked to check delete access to the file
      deleteIfExists

      Deletes a file if it exists.

      As with the delete(Path) method, an implementation may need to examine the file to determine if the file is a directory. Consequently this method may not be atomic with respect to other file system operations. If the file is a symbolic link, then the symbolic link itself, not the final target of the link, is deleted.

      If the file is a directory then the directory must be empty. In some implementations a directory has entries for special files or links that are created when the directory is created. In such implementations a directory is considered empty when only the special entries exist.

      On some operating systems it may not be possible to remove a file when it is open and in use by this Java virtual machine or other programs.

      Parameters: path - the path to the file to delete Returns: true if the file was deleted by this method; false if the file could not be deleted because it did not exist Throws: DirectoryNotEmptyException - if the file is a directory and could not otherwise be deleted because the directory is not empty (optional specific exception) IOException - if an I/O error occurs SecurityException - In the case of the default provider, and a security manager is installed, the SecurityManager.checkDelete(String) method is invoked to check delete access to the file.

      Copy a file to a target file.

      This method copies a file to the target file with the options parameter specifying how the copy is performed. By default, the copy fails if the target file already exists or is a symbolic link, except if the source and target are the same file, in which case the method completes without copying the file. File attributes are not required to be copied to the target file. If symbolic links are supported, and the file is a symbolic link, then the final target of the link is copied. If the file is a directory then it creates an empty directory in the target location (entries in the directory are not copied). This method can be used with the walkFileTree method to copy a directory and all entries in the directory, or an entire file-tree where required.

      The options parameter may include any of the following: