Oc-windows.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Multipart form data php

maxivak / __upload_file.md

We want to upload file to a server with POST HTTP request. We will use curl functions.

see examples:
https://gist.github.com/iansltx/a6ed41d19852adf2e496

This comment has been minimized.

Copy link Quote reply

jaschaio commented Nov 26, 2017

I love you. Tried a lot, this finally worked like I needed it.

This comment has been minimized.

Copy link Quote reply

chmureck commented Dec 16, 2017

Thanks for that, was very useful.
There is a small typo near the beginning:
$url_data = http_build_query($data);
should be
$url_data = http_build_query($fields);

This comment has been minimized.

Copy link Quote reply

SoLoGHoST commented Jan 4, 2018

Where is $url_data even used at? It seems that you have variables being generated that aren’t even used.

This comment has been minimized.

Copy link Quote reply

aliosmanyuksel commented Jan 7, 2018

$filenames = array(«/tmp/1.jpg», «/tmp/2.png»);; —> false
$filenames = array(«/tmp/1.jpg», «/tmp/2.png»); —-> true

This comment has been minimized.

Copy link Quote reply

GennadiyBilyk commented Mar 12, 2018

This comment has been minimized.

Copy link Quote reply

inspiration-tech commented Jul 5, 2018

It works! Thank you, man

This comment has been minimized.

Copy link Quote reply

systemerrorhy commented Aug 2, 2018

can someone explain to me the line: $ fields = array («f1» => «value1», «another_field2» => «anothervalue»);
Is it mandatory to have or different web?

This comment has been minimized.

Copy link Quote reply

systemerrorhy commented Aug 2, 2018

This comment has been minimized.

Copy link Quote reply

gangareddy-blockcoplus commented Aug 28, 2018

This comment has been minimized.

Copy link Quote reply

rodesmola commented Sep 18, 2018

Nice one, thank you!!

This comment has been minimized.

Copy link Quote reply

robtimus commented Oct 31, 2018

I found this when searching for a streaming multipart/form-data solution for cURL. Because I couldn’t find any I wrote my own: https://packagist.org/packages/robtimus/multipart. This works like the above code but doesn’t put everything in memory; it uses cURLs read function instead.

This comment has been minimized.

Copy link Quote reply

faai5200 commented Nov 14, 2018

$filenames = array(«/tmp/1.jpg», «/tmp/2.png»);; —> false
$filenames = array(«/tmp/1.jpg», «/tmp/2.png»); —-> true

Not an issue bro 🙂

  • © 2020 GitHub, Inc.
  • Terms
  • Privacy
  • Security
  • Status
  • Help

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Multipart form data php

Multipart-формы

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

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

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

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

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

  • Поле выбора файла для закачки ;
  • Поле указания имени файла, которое он должен будет иметь на сервере .

Обработка 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 ).

// На всякий случай создадим каталог. Если он уже создан,
// сообщение об ошибки мы не увидим, поскольку воспользуемся оператором @:

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

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

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

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

Читать еще:  Лямбда функции php

chown apache:apache uploads

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

chmod 1777 uploads

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

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

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

php

// Каталог, в который мы будем принимать файл:
$ uploaddir = ‘./files/’ ;
$ uploadfile = $ uploaddir . basename ($ _FILES [ ‘uploadfile’ ][ ‘name’ ]);

// Копируем файл из каталога для временного хранения файлов:
if ( copy ($ _FILES [ ‘uploadfile’ ][ ‘tmp_name’ ], $ uploadfile ))
<
echo «

Файл успешно загружен на сервер

Ошибка! Не удалось загрузить файл на сервер!

Информация о загруженном на сервер файле:

Оригинальное имя загруженного файла: » .$ _FILES [ ‘uploadfile’ ][ ‘name’ ]. «

Mime-тип загруженного файла: » .$ _FILES [ ‘uploadfile’ ][ ‘type’ ]. «

Размер загруженного файла в байтах: » .$ _FILES [ ‘uploadfile’ ][ ‘size’ ]. «

Временное имя файла: » .$ _FILES [ ‘uploadfile’ ][ ‘tmp_name’ ]. «

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

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

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

В случае, если такая форма была отправлена, массивы $_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 , смотрите здесь.

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

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

Первым делом, что нужно усвоить — это то, что сама HTML-форма, в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:

Ключевой момент здесь — это атрибут «enctype» со значением «multipart/form-data«. Без него ничего работать не будет.

Теперь пишем скрипт «loading.php«, в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:

В результате, Вы увидите содержимое глобального двумерного массива $_FILES:

  • name — имя загружаемого файла.
  • typeMIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type, иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
  • tmp_name — физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
  • error — код ошибки. Если , то ошибок нет.
  • size — размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов. Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ).

И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES).

Теперь давайте уже закончим с загрузкой файлов на сервер в PHP, и для этого напишем такой код («loading.php«):

То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию «images» с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.

Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 62 ):

    У меня этот скрипт не работает! Неделю голову ломал. PHP говорит, что одно значение лишнее. Убирал каждое по очереди: в двух синтаксическая ошибка, в другой — просто ничего.

    Вот посмотри тут может яснее будет http://saitsozdanie.ru/php/php-zagruzka-fajlov-na-server.html

    а что прописывается в пункте [somename] и [tmp_name]?? в [name] пишется имя файла, что на форме?

    somename — это название поля с файлом в HTML-форме, а в tmp_name прописывается временный путь к файлу на сервере. Он генерируется самим PHP.

    тоесть [tmp_name] оставляем пустым или так и писать [tmp_name]? (Выберите фоновый рисунок: ) Здесь [somename]=path? а что пишется тогда в после [name]?

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

    ————— «; PRINT «Вас приветствует «.$_POST[‘firstname’]; PRINT «

    Читать еще:  Php pdo connect

    «; PRINT «Название статьи — «.$_POST[‘articlename’]; Print «

    «; $uploadfile = «images/».$_FILES[‘somename’][‘name’]; move_uploaded_file($_FILES[‘somename’][‘tmp_name’], $uploadfile); ?> вроде бы сделал все правильно, но ничего вообще не выводит.

    Учитесь искать ошибки самостоятельно: http://myrusakov.ru/php-finderror.html Это действительно очень важно! И на будущее. Ваши ошибки происходят от того, что Вы изначально неправильно работаете. Вот правильный подход к программированию: http://myrusakov.ru/how-programming.html

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

    Создайте несколько полей типа file, и берите все файлы из массива $_FILES.

    а как-то более красивше. ну скажем, нельзя же предусмотреть, сколько изображений клиент захочет загрузить. как работать с multiple?

    И так красиво. А поля можно добавлять по мере их заполнения через JavaScript.

    У Вас есть статья, как добавлять эти поля после заполнения верхних через яву?

    Через onclick можно и проверку value, если оно не пустое, то добавить ещё одно поле, иначе ничего не делать. Если знаете JS, то прекрасно меня поймёте. Если нет, то статей подобных у меня нет.

    Здравствуйте, у меня php выдает ошибки: [[ Warning: move_uploaded_file(images/img.png) [function.move-uploaded-file]: failed to open stream: No such file or directory in I:hometest1.ruwwwloading.php on line 3 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘I:tmpphpF453.tmp’ to ‘images/img.png’ in I:hometest1.ruwwwloading.php on line 3 ]]

    Директории не существует, куда Вы отправляете файл.

    Народ у меня есть скрипт, но я не могу реализовать под php — помогите пожалуйста!

    Мне кто-нибудь поможет. Я даж заплачу за потраченное время!

    Михаил, а почему бы вам не сделать свой хостинг изображений специально для форума, чтобы люди могли загружать изображения и вставлять ссылку в сообщение на форуме? Было бы очень удобно а главное оригинально так как никто не додумается такое сделать и вы будете единственным с такой возможностью

    Идея не нова, но я так сделаю. Но всё это будет не раньше весны.

    Будет интересно посмотреть

    В статье ошибка, в самом начале, пропущена буква «О» в слове «видеОхостинги». Мелочь, конечно. 🙂

    У меня такая проблема: записываю файл на сервер, всё записывается нормально. Но если попытаться снова записать с тем же именем, то он не перезаписывается. Но время файла (атрибуты) обновляется. Не подскажете как быть?

    Всё должно перезаписываться, из-за чего такая ошибка — да миллиард причин могу придумать, даже больше. Первый вариант — невнимательность, перезаписываете на один и тот же файл. Второй вариант — попробуйте в другом браузере файл отправить. Остальные варианты уже сами придумывайте, их очень много. В общем, тут надо просто всё очень тщательно проверять. Вот ещё этот метод можно использовать: http://myrusakov.ru/php-finderror.html

    У меня получается что изображение с веб камеры сохраняется допустим с именем 123.jpg. если такого файла нет, то всё нормально. А если я хочу это фото обновить. То есть перезаписать по верх старого, он только атрибуты файла меняет. А само изображение не перезаписывает. У меня подозрение что я просто что то не так делаю. Может сперва старый файл удалить нужно?

    Попробуйте так, для удаления используйте unlink().

    Так и сделал. Всё получилось! Благодарю.

    У меня проблема такая: не могу загрузить на сервер. На всех папках стоит право доступа 777. Код: http://pastebin.com/p6Ash6BN

    Код ошибки какой?

    Михаил, такой вопрос. Фотография выводится на одной странице со ссылкой на статью, как сделать, так чтобы эта же картинка выводилась на странице со статьей??

    Здравствуйте Михаил, хотел спросить, делаю загрузку файлов,все работает пока не загружаю файл размер которого больше post_max_size = 8M, после нажатия кнопки массивов $_POST и $_FILES просто нет, как обрабатывать такие ошибки.

    Здравствуйте, Михаил! У меня вопрос: как сделать своё уникальное имя для каждого файла? То есть что бы не было такого, что бы два пользователя загрузили разные файлы с одинаковым именем.

    Генерировать это имя в PHP, например, используя это: http://myrusakov.ru/php-uniqid.html

    А может ли быть так, что функция uniqid вернет такой же ключ как и возвращал раньше?

    Чисто теоретически всё может быть, но на практике я думаю, что таких случаев не было.

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

    Что такое 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 artisan key generate

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

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

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

    В файле 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

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