Как в PHP залить файл из поля «type=file» в определенную директорию (является субдиректорией от


Содержание материала:

Как загрузить (upload) файл PHP

Содержание

Теория

Это нужно, для понимания что и как работает.

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

На этом, сам процесс «аплоада» можно считать завершенным.

Что вы потом сделаете с этим файлом, вопрос другой.

И еще: все трудности под Win32 связанные с «непониманием» системой конструкции вида «\PHP2»; (кто сталкивался, поймет) кроются в файле php.ini (php3.ini) Лично у меня, это выглядит так (получено опытным путем):

С такими настройками, никаких проблем я не замечал. Попробуйте.

Теперь про ограничение размера загружаемого файла. Конечно, и в php.ini есть параметр upload_max_filesize, можно ограничить и размер и тип указанием соответствующих параметров в теге FORM, но, в любом из этих случаев мы получим ошибку, которую не сможем обработать. Что не здорово. Поэтому, удобней ограничивать размер в самом скрипте.

НО: РАЗМЕР файла невозможно узнать до ПОЛНОЙ загрузки файла на сервер. Никаким способом.

Также, при uploade, до ЗАВЕРШЕНИЯ загрузки, файл хранится в памяти, потом пишется во временную директорию, и, еще раз напомню, сразу удаляется из temp по завершению работы скрипта. В общем, с помощью PHP не получится сделать индикатор загрузки файлов.

Пример

Итак, сначала у нас файл upload.html примерно такого вида:

Теперь, сам скрипт:

Итак, если Вы не удосужились открыть Manual, рассказываю (хотя, FAQ то он, конечно, FAQ, но чтение manual’ов никто не отменял):

В форме есть поле с type=file и именем file1. При аплоаде, у нас возникают переменные:

  • $file1 — имя файла во временной директории;
  • $file1_name — исходное имя файла;
  • $file1_type — MIME тип файла;
  • $file1_size — размер файла;

Так, осталось рассмотреть случай, когда PHP работает в safe-mode. То есть, если вы сделали все как написано, а вам говорят Safe-mode restriction is effect… Или, про то, что невозможно выполнить команду copy() — попробуйте copy() заменить на move_uploaded_file().

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

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

Возможные глюки

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

Картинки загружаются, но не показываются. Бинарные файлы загружаются, но не запускаются (или, не распаковываются, если это архив).

Основная причина данной проблемы — Russian Apache.

Именно он (то есть, WEB server) перекодирует все, что ни попадя. Соответственно, после такой перекодировки, в файлах оказываются замещенными (перекодированными) некоторые символы. Что избежать подобного есть несколько решений:

1) В директории, где лежит скрипт для Upload’a делаем файл (.htaccess) в котором пишем:

2) В файл httpd.conf дописать строки:

Обычно, этого вполне достаточно для решения проблемы.

Upload и PHP4

в PHP4 работа с upload`ами стала несколько иной. Теперь вся информация о залитых файлах хранится в массиве $HTTP_POST_FILES для примера:

если у нас в форме было так: то информацию о файле надо смотреть здесь:

Оригинальное имя файла. Например «screen1.jpg»

mime type файла. Например «image/gif».

Размер файла в байтах

Временное имя файла на сервере.

Дополнительная информация по теме

Инструкция по архивированию файлов средствами PHP с примерами и рекомендациями опытных программистов

Как провести защиту от спамеров с использованием PHP — PHP код, проверка данных и пример

Несколько простых советов на тему о том, как сохранить свой пароль от любопытных глаз и рук

В данной статье описывается, что такое сканер и как правильно настроить данное устройство

Как получить путь к файлу в html в PHP?

Может ли кто-нибудь рассказать мне, как получить путь к файлу с помощью html в PHP?

и в csv_to_database.php

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

Вы не должны просто использовать $_GET который у вас есть сейчас. Ваш файл находится в $_FILES[«csv_file»][«tmp_name»] .

Лучше всего вы просмотрите этот учебник , который в основном говорит, что вам нужно сделать что-то вроде этого:

И вы можете идти оттуда. Используйте move_uploaded_file если вы хотите переместить файл из временного местоположения, также объясненного в учебнике ��

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

Прежде всего, вы должны изменить свой метод формы для post и добавить enctype=»multipart/form-data» .

Затем вы можете получить временный путь к файлу из $_FILES[‘csv_file’][‘tmp_name’] .

В вашем вызове fopen используйте $_GET[‘csv_file’][‘tmp_name’] – это указывает на файл на сервере сразу после загрузки.

Облако тэгов

мои изыскания на случай забывания

В данной статье подразумевается, что читатель знает что такое web-приложение, умеет создавать формы любой сложности на HTML, имеет представление о назначении php и его базовых инструкциях, знаком с базовыми понятиями СУБД.

Часто возникает необходимость сохранить в базе данных бинарные данные (например изображения в различных форматах, pdf-документы или что-то подобное). Хотя во многих базах данных, в том числе и в MySQL, предусмотрена возможность сохранять бинарные данные (например, изображения) в полях типа BLOB (Binary Large Object), операции с данными типа INT, CHAR, VARCHAR
и другими значительно эффективнее. Поэтому в базах данных часто гораздо
удобнее и эффективнее сохранять не сами изображения, а ссылки на содержащие их файлы. Такими ссылками являются имена файлов. Кроме того, в web-приложениях обращение к файлам происходит в HTML через ссылки на имя внешнего файла. Далее речь пойдет о том как загрузить файлы на сервер и как использовать их совместно с данными, сохраненными в базе данных, для создания web-приложения средствами php.

Клиентская часть (отправка файлов):

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

Атрибуты перечислены ниже:

  • accept — устанавливает фильтр на типы файлов, которые вы можете отправить через поле загрузки файлов. Возможные значения: image/jpeg (только файлы в формате JPEG), image/jpeg, image/png (только файлы в формате JPEG и PNG), image/* (любые графические файлы), image/*, video/* (любые графические и видео-файлы).
  • multiple — позволяет выбирать и загружать сразу несколько файлов.
  • size — ширина текстового поля, которое определяется числом символов моноширинного шрифта. В браузере Chrome этот атрибут игнорируется
  • name — имя поля, используется для его идентификации обработчиком формы

ВАЖНО! В форме, где будет размещаться данная инструкция необходимо задать метод отправки — POST (method=»post») и значение атрибута enctype — multipart/form-data (enctype=»multipart/form-data»).

Дополнительно можно задать ограничения на размер загружаемого файла с помощью элемента input с типом hidden, размещенного перед командой для загрузки файлов:

Пример формы с возможностью загрузить файлы, размером не более 32 кБайт:

Загрузка файлов на сервер в 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 «

    «; 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:\home\test1.ru\www\loading.php on line 3 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘I:\tmp\phpF453.tmp’ to ‘images/img.png’ in I:\home\test1.ru\www\loading.php on line 3 ]]

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

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

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

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

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

    Как загрузить файл в PHP (с примером)

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

    Настройка параметров PHP

    Существует несколько настроек конфигурации PHP, которые вам следует предварительно проверить для успешной загрузки файлов. В этом разделе мы рассмотрим все параметры, которые важны для загрузки файлов PHP. Эти параметры можно настроить в файле php.ini.

    Если вы не знаете, где найти файл php.ini, вы можете использовать php_ini_loaded_file() , чтобы найти его. Просто создайте файл PHP на своем сервере со следующей строкой и откройте его из браузера.

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

    Ключевые настройки

    file_uploads

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

    upload_max_filesize

    Директива upload_max_filesize позволяет вам настроить максимальный размер загруженного файла. По умолчанию он установлен в 2M (два мегабайта), и вы можете переопределить этот параметр, используя файл .htaccess. Два мегабайта не очень соответствуют сегодняшним стандартам, поэтому вам, возможно, придется это увеличить. Если вы получите сообщение об ошибке — file exceeds upload_max_filesize при попытке загрузить файл, вам необходимо увеличить это значение. Если вы это сделаете, обязательно увеличьте post_max_size (см. ниже).

    upload_tmp_dir

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

    post_max_size

    Директива post_max_size позволяет настроить максимальный размер данных POST. Поскольку файлы загружаются с помощью POST-запросов, это значение должно быть больше, чем указано в директиве upload_max_filesize . Например, если ваш upload_max_filesize составляет 16M (16 мегабайт), вам может потребоваться установить post_max_size в 20M .

    max_file_uploads

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

    max_input_time

    Это максимальное количество секунд, которое скрипту разрешено анализировать входные данные. Вы должны установить его на разумное значение, если вы имеете дело с большими загрузками файлов. 60 (60 секунд) является хорошим показателем для большинства приложений.

    memory_limit

    Директива memory_limit указывает максимальный объем памяти, который может потреблять скрипт. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вам необходимо убедиться, что значение этой директивы больше, чем указано в директиве post_max_size . Значение по умолчанию — 128M (128 мегабайт), поэтому, если у вас нет очень больших post_max_size и upload_max_filesize , вам не нужно беспокоиться об этом.

    max_execution_time

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

    Теперь давайте построим реальный пример, чтобы продемонстрировать загрузку файлов в PHP.

    Создание формы HTML

    После того, как вы настроили параметры PHP, вы готовы испытать возможности загрузки файлов PHP.

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

    Мы собираемся создать два файла PHP: index.php и upload.php. Файл index.php содержит код, который отвечает за отображение формы загрузки файла. С другой стороны, файл upload.php отвечает за загрузку файла на сервер.

    Кроме того, файл будет загружен в каталог uploaded_files, поэтому вам нужно убедиться, что эта папка существует и доступна для записи пользователем web-server .

    В этом разделе мы рассмотрим ключевые части файла index.php.

    Давайте посмотрим на файл index.php на GitHub:

    Хотя это может показаться типичной формой PHP, существует важное различие в значении атрибута enctype тега

    AJAX загрузка файлов на сервер с помощью jQuery

    В этой заметке вы узнаете, как реализовать AJAX загрузку файлов на сервер с использованием jQuery. Это не так уж сложно!

    Не знаю точно, но что-то мне подсказывает, что до появления jQuery загрузка файлов на сервер по AJAX технологии была чем-то очень непонятным, а значит крайне сложным. Но сегодня с появлением jQuery даже не обладающий опытом веб-мастер может сделать это без особых усилий. Однако, так или иначе, разобраться все же придется. И сейчас я попробую очень коротко и понятно объяснить вам, как это делается, а чтобы проще было воспринимать, урок содержит только нужное и разбит на шаги.

    Замечу заранее, что эта статья вряд ли поможет, если вы совсем плохо разбираетесь в jQuery и PHP, базовые знания обязательны. И, пожалуй, обязательно иметь хоть какой-то опыт в загрузке файлов (картинок) на сервер с обычной HTML формы, по крайней мере нужно представлять как это работает.

    Ну, меньше слов, приступим!

    Для начала предположим, что у нас есть такой HTML код: поле и кнопка загрузки:

    1. Получение данных файла из поля file

    Первое что нам нужно сделать — это получить данные input поля при добавлении в него файла(ов). Для этого прикрепим к событию change свою функцию, которая установит данные файла:

    Этот код сохранит данные поля type=»file» в переменную files , с которой мы будем работать дальше.

    2. Загружаем файлы по клику

    Теперь, нам нужно повесить событие клика на кнопку » Загрузить файлы «. Тут и будет посылаться AJAX запрос с данными файлов.

    Создадим функцию, повесим ее на событие click и отправим AJAX запрос с данными файлов. Этот запрос отличается от обычного AJAX запроса, и тут не подходит обычная отправка POST данных:

    Что делает функция? Создает новый объект new formData() , добавляет в него данные файлов из массива files . Затем этот объект данных формы передается в AJAX запрос. 2 параметра нужно установить в false обязательно:

    • processData — потому что jQuery будет конвертировать массив files в строку, и сервер не сможет получить данные.
    • contentType — потому что дефолтные установки jQuery равны application/x-www-form-urlencoded , что не предусматривает отправку файлов. А еще, если установить этот параметр в multipart/form-data , похоже это ничего не даст.

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

    Чтобы наглядно показать, как обрабатывать отправленный во втором пункте запрос, приведу простой php-скрипт, без всяких проверок.

    Создадим файл submit.php и добавим в него этот код (предполагается что submit.php лежит в той же папке, где и файл, с которого отправляется AJAX запрос):

    Не используйте этот код напрямую! Пишите свой!

    Заключение

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

    Чтобы не собирать весь вышеописанный код вручную, скачайте вот этот архив: ajax-file-upload.zip . Загрузите его содержимое на ваш php сервер, зайдите в паку из архива, и попробуйте загрузить файл. Вы увидите, как все это работает, сможете «пошаманить» над кодом и разобраться подробнее в реальных условиях.

    Также, рекомендую к прочтению статью о базовых знаниях для создания AJAX запросов в WordPress:

    Знания из этой статьи вам очень пригодятся при создании AJAX загрузки файлов под WordPress.

    Автор: Тимур Камаев

    Насколько полезным был этот пост?

    Нажмите на звезду, чтобы оценить этот пост!

    Средний рейтинг: 4.3 / 5. Количество голосов: 9

    Мониторинг изменений в директориях и файлах средствами Delphi. Часть #2.

    В предыдущем посте мы остановились на том. что разработали небольшое приложение, которое проводило мониторинг изменений в определенной директории и, в случае обнаружения какого-либо изменения, «сигналило» нам. Для организации мониторинга мы использовали поток (TThread) в котором использовалось три взаимосвязанные функции Windows: FindFirstChangeNotification, FindNextChangeNotification и FindCloseChangeNotification.

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

    Итак, сначала вспомним как выглядел TURLClient.Execute

    Здесь мы получили всего один хэндл события с помощью которого отслеживали сразу несколько возможных изменений в директории — изменение имени файла, изменение имени директории и изменение размера. Так как хэндл был всего один, то нам вполне достаточно было использовать функцию WaitForSingleObject для ожидания события. Но нам ведь никто не запрещает получить не один, а, например, три хэндла событий каждое из которых будет срабатывать на конкретно заданное изменение? Давайте сделаем это, а заодно и разберемся с работой ещё одной функции для обработки событий. Итак, пишем новый Execute потока:

    В приведенном выше Execute мы определили массив на 3 элемента, где каждый элемент — это хэндл события рассчитанного на определенный вид изменений в директории. Таким образом мы получили возможность пусть и не полностью, но конкретизировать изменения. Так как мы планируем ожидать несколько событий, то вместо метода WaitForSingleObject мы воспользовались методом WaitForMultipleObjects, который в MSDN имеет следующее описание:

    WaitForMultipleObjects

    nCount: DWORD — количество хэндлов событий. Этот параметр не может быть равен нулю. Максимальное количество ожидаемых событий ограничивается значением константы MAXIMUM_WAIT_OBJECTS = 64 ;
    lpHandles: PWOHandleArray — указатель на массив дескрипторов. Массив не должен содержать повторяющихся THandle.
    bWaitAll: boolean — если значение этого параметра равно True , то функция вернет значение только в том случае, если будет получен сигнал от всех событий хэндлы которых определены в массиве. В случае, если значение флага равно False , то функция будет возвращать значения при срабатывание любого из событий, при этом возвращаемое значение будет указывать на объект, который изменил состояние.
    dwMilliseconds:DWORD — время в мс ожидания события. Если значение этого параметра равно INFINITE , то функция будет возвращать значение только при срабатывании одного из событий.

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

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

    Использование функций CreateFile и ReadDirectoryChangesW

    Прежде, чем перейдем к примеру на Delphi, посмотрим на описание этих двух функций.
    Функция CreateFile создает или открывает файл или другое устройство ввода/вывода (файл, файловый поток, каталог и т.д.

    CreateFile

    lpFileName: PChar — имя файла или устройства ввода/вывода, которое будет создано или открыто.
    dwDesiredAccess: cardinal — флаг, определяющий режим доступа к файлу или устройству (чтение, запись, чтение и запись). Наиболее часто используемые значения GENERIC_READ, GENERIC_WRITE, или сразу оба (GENERIC_READ or GENERIC_WRITE).
    dwShareMode:cardinal — один или несколько флагов, определяющих режим совместного доступа к файлу или устройству. Для установки значений могут использоваться следующие константы:
    FILE_SHARE_DELETE (0x00000004) — разрешает другим процессам получать доступ к файлу или устройству в том числе и выполнять операции удаления.
    FILE_SHARE_READ (0x00000001) — разрешает другим процессам выполнять операции чтения.
    FILE_SHARE_WRITE (0x00000002) — разрешает другим процессам выполнять операции записи.
    lpSecurityAttributes:PSecurityAttributes — указатель на структуру SECURITY_ATTRIBUTES, содержащую дополнительные параметры безопасности работы с файлом или устройством. Этому параметру можно присваивать значение nil.
    dwCreationDisposition:cardinal — флаг, который определяет какие действия следует применить к файлу или устройству. Для всех устройств, кроме файлов, этот параметр обычно устанавливается в значение OPEN_EXISTING. Также может принимать следующие значения:
    CREATE_ALWAYS (2) — всегда создавать новый файл. Если файл уже существует и доступен для записи, то код последней ошибки устанавливается в значение ERROR_ALREADY_EXISTS (183) . Если файл не существует и указан правильный к нему путь, то создается новый файл. а код последней ошибки устанавливается в 0.
    CREATE_NEW (1) — создать новый файл. Если файл с таким именем уже существует, то вернется код ошибки ERROR_FILE_EXISTS (80) .
    OPEN_ALWAYS (4) — всегда открывать файл. Если файл существует, то функция завершится успешно, а код последней ошибки будет установлен в значение ERROR_ALREADY_EXISTS (183) . Если же файл не существует и указан верный путь, то создастся новый файл, а значение код последней ошибки будет установлено в 0.
    OPEN_EXISTING (3) — открыть файл или устройство, только если файл или устройство существуют. Если объект не найден, то вернется код ошибки ERROR_FILE_NOT_FOUND (2) .
    TRUNCATE_EXISTING (5) — открыть файл и урезать его размер до 0 байт. Если файл не существует, то вернется код ошибки ERROR_FILE_NOT_FOUND (2).
    dwFlagsAndAttributes:cardinal — сочетание флагов и атрибутов файла или устройства. Значения обычно начинаются с FILE_ATTRIBUTE_* или FILE_FLAG_*. Наиболее часто используется значение FILE_ATTRIBUTE_NORMAL. При использовании функции CreateFile совместно с ReadDirectoryChangesW необходимо использовать также флаг FILE_FLAG_BACKUP_SEMANTICS.
    hTemplateFile: THandle — дескриптор временного файла с режимом доступа GENERIC_READ. Значение этого параметра может быть равно nil.

    ReadDirectoryChangesW

    hDirectory:THandle — дескриптор директории за которой будет проводится наблюдение. Это значение мы получим, выполнив CreateFile.
    lpBuffer:pointer — указатель на буфер в который буду записываться обнаруженные изменения. Структура записей в буфере соответствует структуре FILE_NOTIFY_INFORMATION (см. описание ниже). Буфер может записываться как синхронно, так и асинхронно в зависимости от заданных параметров.
    nBufferLength:cardinal — размер буфера lpBuffer в байтах.
    bWatchSubtree:booleanTrue указывает на то, что в результаты мониторинга будут попадать также изменения в подкаталогах.
    dwNotifyFilter:cardinal — фильтр событий. Может состоять из одного или нескольких флагов:
    FILE_NOTIFY_CHANGE_FILE_NAME (0x00000001) — любое изменение имени файла. Сюда же относятся и операции удаления или добавления файла в каталог или подкаталог.
    FILE_NOTIFY_CHANGE_DIR_NAME (0x00000002) — любое изменение имени подкаталога, включая добавление и удаление.
    FILE_NOTIFY_CHANGE_ATTRIBUTES (0x00000004) — изменение атрибутов файла или каталога.
    FILE_NOTIFY_CHANGE_SIZE (0x00000008) — изменение размера файла. Событие будет вызвано только после того как размер файла изменится и файл будет записан.
    FILE_NOTIFY_CHANGE_LAST_WRITE (0x00000010) — изменение времени последней записи в файл или каталог.
    FILE_NOTIFY_CHANGE_LAST_ACCESS (0x00000020) — изменение времени последнего доступа к файлу или каталогу.
    FILE_NOTIFY_CHANGE_CREATION (0x00000040) — изменение времени создания файла или каталога.
    FILE_NOTIFY_CHANGE_SECURITY (0x00000100) — изменение параметров безопасности файла или каталога.
    lpBytesReturned:cardinal — в случае синхронного вызова функции этот параметр будет содержать количество байт информации, записанной в буфер. Для асинхронных вызовов значение этого параметра остается неопределенным.
    lpOverlapped:POVERLAPPED — указатель на структуру OVERLAPPED, которая поставляет данные, которые будут использоваться во время асинхронной операции. Это значение может быть равным nil .
    lpCompletionRoutine:POVERLAPPED_COMPLETION_ROUTINE — указатель на callback-функцию. Этот параметр может устанавливаться в значение nil .

    Описания функций есть. Теперь напишем с помощью этих двух функций новую заготовку для Execute нашего потока для мониторинга изменений в директориях и файлах Windows:

    Тема: Upload (Загрузка файлов на сервер)

    Показано с 1 по 1 из 1

    Опции темы
    Поиск по теме
    Отображение
    • Линейный вид
    • Комбинированный вид
    • Древовидный вид

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

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

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

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

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

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

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

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

    Если ваш веб-сервер работает под управлением операционной системы 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

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

    chown apache : apache uploads

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

    chmod 1777 uploads

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

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

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

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

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

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

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

    // Выводим информацию о загруженном файле:
    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] также будут инициализированы.

    Как узнать полный путь к выбранному файлу из

    input type=»file» name=»file» multiple=»true» accept=»image/jpeg,image/gif,image/x-png» />

    Мне необходимо сразу после выбора картинки отобразить её миниатюру (еще до загрузки).
    Думал сделать нечто банальное:

    getElementBy ).value;
    img src=»» />

    Но браузеры либо ничего не подставляют, либо «C:\fakepath\имя_файла» либо вообще только имя_файла. Погуглив выяснил что это все из-за политики безопасности браузеров.
    Посоветуйте какой-нибудь клиентский способ решения проблемы. В голову приходит только отправка файла ajax’ом обработчику для уменьшения и отдачи скрипту. Но хотелось бы не кушать трафик пользователей да и сервер нагружать лишний раз.
    Может быть есть какой-нибудь другой способ решения проблемы? Может-быть с помощью клиентского Java?
    Заранее спасибо!

    UPD: вычитал что у Firefox и Chrome есть input.files[0].getAsDataURL(); Для других браузеров ничего похожего не найти? 🙂

    UPD2: Пробовали с другом java-апплет сваять, оказывается их тоже ограничили в отличии от dexktop и server… Вроде бы только через хитрый нативный код на Си можно нарушить запреты 🙂 Ито для этого дела нужно писать еще и библиотеки под разные платформы + подписать и сделать доверительными…

    Как загрузить файлы в конкретной директории

    Я работаю на простой вещи , которая загружает файлы с помощью PHP.
    Моя форма:

    Файлы успешно загружать только в uploads папке. В этой uploads папке, у меня есть несколько других папок: 1 , 2 , 3 и так далее.

    Мой вопрос: Как переместить файлы в определенной подпапке после загрузки? (Имя подпапки — с переменной id .) Спасибо!

    Эффективный способ сделать это:

    Этот шаг файл метод, когда он получить загружен.

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

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

    Топ-пост этого месяца:  Категории функций — HTTP API — WordPress
    Добавить комментарий