Обработка загрузки файлов


Содержание

Обработка загрузки файлов

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:

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 настроен и позволяет загружать файлы. Для этого в php.ini стоит проверить директиву file_uploads , и, если она выключена, то включить.

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

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

Стоит отметить, что разные браузеры будут визуализировать поле загрузки файла по-разному. IE, Firefox и Opera отображают его как текстовое поле с кнопкой рядом с ней надписью «Обзор» или «Выбрать». Safari отображает ее так же, как кнопку с надписью: «Выбрать файл». По большому счету это не проблема с тех пор, как пользователи привыкли к тому, как поле отображается в своем браузере и умеют его использовать. Иногда, однако, вы столкнетесь с клиентом или дизайнером, который непреклонно представляет его определенным образом. Количество CSS и JavaScript, которые могут применяться к файловому полю, крайне ограничено из-за соображений о безопасности, наложенных браузерами. Типизация файла может быть затруднена. Если внешний вид очень важен для вас, я рекомендую вам прочитать одну из статей «Питер-Пол Кох» типа ввода = «файл» .

Переходим на сервере и работаем с PHP

Информация о загрузке файла предоставляется с помощью многомерного массива $_FILES . Этот массив обладает своей структурой, назначенными именами для полей файла в форме HTML, точно так же, как и при работе с $_GET и $_POST . Затем массив каждого файла содержит следующие элементы:


  • $_FILES[«myFile»][«name»] — хранит исходное имя файла;
  • $_FILES[«myFile»][«type»] — сохраняет mime-типа файла;
  • $_FILES[«myFile»][«size»] — сохраняет размер файла (в байтах);
  • $_FILES[«myFile»][«tmp_name»] — хранит имя временного файла;
  • $_FILES[«myFile»][«error»] — хранит код ошибки, полученный в результате передачи.

При помощи функции move_uploaded_file() мы можем перенести файл из своего временного каталога в постоянное место. Так же хорошей практикой является использовать именно её вместо copy() и rename() для этой цели, поскольку она выполняет дополнительные проверки, чтобы гарантировать, что файл был действительно загружен запросом HTTP методом POST.

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

Вот так как выглядит получение и обработка загрузки файла при помощи PHP:

Сначала мы удостоверяемся, что PHP загрузка файла на сервер прошла без ошибок. Затем определяем безопасное имя файла, как я только что описал выше, а затем перемещаем файл в его конечный каталог с помощью move_uploaded_file() . И наконец делаем вызов chmod() , чтобы убедиться, что в новом файле установлены необходимые права доступа.

Вопросы безопасности

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

Илон Маск рекомендует:  Cgi программирование вывода в клиентскую среду

Один из них заключается в том, чтобы проверить тип загружаемого файла, каким он должен быть. Опираться на значение $_FILES[«myFile»][«type»] или на расширение имени файла не является безопасным, поскольку оба могут легко подделываться. Скорее, используйте функцию exif_imagetype() , чтобы проверить содержимое файла и определить, действительно ли это GIF, JPEG или один из нескольких других поддерживаемых форматов изображений. Если exif_imagetype() недоступен (функция требует, чтобы расширение Exif было включено), вы можете использовать getimagesize() . Массив, возвращаемый ей, будет содержать тип изображения, если он распознан.

Для файлов без изображения вы можете использовать exec() для вызова утилиты файлов unix. он определяет тип файла, ища известные двоичные подписи в ожидаемых местах.

Еще один шаг, который вы можете предпринять, — наложить жесткие ограничения на общий размер запроса POST и количество файлов, которые можно загрузить. Для этого укажите соответствующее значение для директив upload_max_size , post_max_size и max_file_uploads в php.ini. Директива upload_max_size указывает максимальный размер загрузки файла. В дополнение к размеру загрузки вы можете ограничить размер всего запроса POST директивой post_max_size . max_file_uploads — это новая директива (добавлена в версии 5.2.12), которая ограничивает количество загрузок файлов. Эти три директивы помогают защитить ваш сайт от атак, которые пытаются нарушить его доступность, вызывая интенсивный сетевой трафик или загрузку системы.

Третий шаг, который вы можете предпринять для минимизации риска, — это сканирование загруженных файлов с помощью антивирусного сканера. Это жизненно важно для защиты от распространённых вирусов и вредоносных программ, особенно если ваш сайт осуществляет файлообмен между разными людьми, как пример — вложения в веб-почтовый клиент или (юридический) сайт для обмена файлами. Существует расширение PHP, которое обеспечивает доступ к ClamAV , но, конечно, вы можете вызвать утилиту командной строки ClamAV так же, как я продемонстрировал для файла.

Подводим итоги и делаем выводы

Сегодня вы узнали, как происходит настройка и осуществляется процесс PHP загрузки файлов на сервер с вашего сайта или веб-приложения. Чтобы загрузка была успешной, форма HTML должна быть отправлена через запрос POST с множественным форматированием данных, а PHP должен разрешать передачу, как указано, с помощью директивы file_uploads . После переноса файла, сценарий, ответственный за обработку загрузки, использует информацию, найденную в массиве $_FILES , чтобы переместить файл из временного каталога в нужное место. Я также поделился некоторыми дополнительными мерами предосторожности, которые вы можете предпринять, чтобы защитить себя и своих пользователей от некоторых рисков, связанных с возможностью загрузки файлов. Чтобы гарантировать свою безопасность — проверяйте тип файла, наложите жесткие ограничения на загрузку трафика и применяйте сканирование на наличие вирусов.

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

Обработка загрузки файлов

Мой текущий скрипт:

У меня возникли проблемы с подачей файлов для скачивания. Речь идет о файлах .exe и .mde, некоторые довольно большие.

Я предоставляю ссылку так:

который указывает на приведенный выше скрипт.

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

Если я оставлю диалоговое окно на несколько секунд (ни нажав «Сохранить», ни «Отменить»), появится следующее диалоговое окно:

Если я сразу нажму «Сохранить», загрузка начнется, но сразу же завершится неудачей.

Может кто-нибудь сказать мне, где я иду не так здесь?

РЕДАКТИРОВАТЬ: Моя среда является учетной записью cPanel на VPS. У меня есть доступ администратора WHM.

Форма обратной связи с автоматическим скачиванием файла

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

Статья, по просьбе одного из читателей, так что, если у вас есть какие-то вопросы, можете писать в раздел «ваши предложения» или мне в социальные сети. Периодически такие посты «по заказам» появляются на блоге. Кроме того, человек обещал отблагодарить финансово, так что, выгода и вам и мне.

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

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

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

Контактная форма с автоматическим скачиванием

Итак, давайте перейдем к форме. Исходник, как обычно, в конце статьи.

Для примера я сделал простую контактную форму с 2 полями и кнопкой. Кроме того, сделал одной скрытой поле в котором передаю тему, в данном случае уведомление о том, что скачали прайс. Блоки с классом «contact-form__msgs» под каждым из полей отвечают за вывод сообщения о том, что имя или телефон небыли заполнены. На видео, вы могли видеть их, подсвеченные красным.

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

Структура проекта

Если вы давно читаете блог, то могли видеть подобную структуру в других формах. Самое интересное находится в папке «js» и «php». Как обычно, в последнее время, для отправки данных я использую PHPMailer, так как с ней удобно работать и она позволяет легко прикрепить файл, в случае необходимости, к письму, как вложение. Но прежде, чем говорить об этом всем, давайте подключим остальные необходимые файлы в наш индексный файл.

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

Кроме того, давайте сразу инициализируем маску и привяжем к нужному полю. В моем случае это поле с классом «contact-form__input_tel».

Можете вынести в отдельный файл, я же инициализировал маску в конце документа, перед закрывающим тегом «body».

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

Теперь давайте рассмотрим папку с php-файлами. В папке phpmailer лежат файлы библиотеки. Их мы править не будем, поэтому ее пропускаем. Больше нас интересует файл «config.php», ведь именно там прописываются почты, с которой и на которую будут приходить письма.

  • «SENDER» — отправитель;
  • «CATCHER» — получатель.

Обратите внимание, что обе почты должны быть реальными. Если есть проблемы с доставкой на Яндекс-почту, то почитайте эту статью.

Файл «contact-form.php» отвечает за валидацию и отправку данных формы на почту. Скрипт достаточно длинный, поэтому не буду приводить его в статье. Если не планируете добавлять поля, то можете не открывать на редактирование и этот файл, ведь то, ради чего затевалась эта статья, находится в файле «contact-form.js», а именно на 33 строке.

Если php-обработчик вернул нам сообщение ‘successmsgs’, свидетельствующее, что форма прошла все проверки и данные были отправлены на почту, то обращаемся (переходим) к по указанному пути, где лежит файл. Таким образом и достигается искомый результат автоматического скачивания файла.

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

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

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

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

Загрузка одного файла

Предположим, у вас есть следующая форма с одним элементом input типа file :

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

В действительности возвращается экземпляр класса waRequestFileIterator , однако в данном случае он работает в качестве прозрачной обертки вокруг единственного экземпляра waRequestFile в списке. Подробнее о классе waRequestFileIterator см. ниже раздел «Загрузка нескольких файлов».

Поля класса waRequestFile доступны только для чтения, их значение полностью аналогично таковым в массиве $_FILES :

$file->tmp_name; значение этого поля также можно получить, если привести переменную $file к типу string :

  • $file->error;
  • $file->extension; — расширение файла, полученное из оригинального имени файла.
  • Методы класса waRequestFile :


    • $file->uploaded() — возвращает true , если имела место загрузка файла на сервер (т. е. значение поля input типа file в веб-форме было непустым); в случае если файл не был загружен на сервер (т. е. если возвращает false ), вызов всех остальных методов класса waRequestFile вернёт экземпляр объекта исключения типа waException ;
    • $file->moveTo(‘path/to/file’) перемещает загруженный файл в указанный каталог (аналогично PHP-функции move_uploaded_file() );
    • $file->moveTo(‘path/to/dir’, ‘filename’) то же самое, но с присвоением нового имени загруженному файлу;
    • $file->copyTo(‘path/to/file’) копирует загруженный файл в указанный каталог;
    • $file->copyTo(‘path/to/dir’, ‘filename’) то же самое, но с присвоением нового имени созданной копии файла;
    • $file->waImage() возвращает экземпляр класса waImage для обработки изображения.

    Внимание! Если загруженный файл не является изображением, вызов конструктора waImage() вызовет Exception . Поэтому рекомендуется использовать такой вызов в блоке :

    Подробнее о классе waImage см. раздел «Изображения».

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

    Рассмотрим загрузку файлов через форму с несколькими элементами input типа file с одинаковым именем:

    возвращает экземпляр класса waRequestFileIterator :

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

    Класс waRequestFileIterator реализует интерфейс Iterator ; это означает, что можно использовать цикл foreach для перебора списка загруженных файлов. Каждый элемент в списке представляет собой экземпляр класса waRequestFile , для которого доступны все описанные выше методы:

    Webasyst — это CMS нового поколения, совмещающая в себе инструменты для управления сайтом и интернет-магазином с полезными приложениями для совместной работы с коллегами и взаимодействия с клиентами. Единый центр управления бизнесом через интернет.

    Платформа
    Магазин Webasyst
    Помощь
    • © 2002—2020 Webasyst
    • О компании
    • Блог
    • Договор-оферта
    • Webasyst.com

    Мы получаем и обрабатываем персональные данные посетителей сайта в соответствии с Политикой обработки персональных данных. Отправка персональных данных с помощью любой страницы сайта подразумевает согласие со всеми пунктами Политики.

    Обработка загрузки файлов

    Мой текущий скрипт:

    У меня возникли проблемы с подачей файлов для скачивания. Речь идет о файлах .exe и .mde, некоторые довольно большие.

    Я предоставляю ссылку так:

    который указывает на приведенный выше скрипт.

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

    Если я оставлю диалоговое окно на несколько секунд (ни нажав «Сохранить», ни «Отменить»), появится следующее диалоговое окно:

    Если я сразу нажму «Сохранить», загрузка начнется, но сразу же завершится неудачей.

    Может кто-нибудь сказать мне, где я иду не так здесь?

    РЕДАКТИРОВАТЬ: Моя среда является учетной записью cPanel на VPS. У меня есть доступ администратора WHM.

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

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

    Загрузка одного файла

    Предположим, у вас есть следующая форма с одним элементом input типа file :

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

    В действительности возвращается экземпляр класса waRequestFileIterator , однако в данном случае он работает в качестве прозрачной обертки вокруг единственного экземпляра waRequestFile в списке. Подробнее о классе waRequestFileIterator см. ниже раздел «Загрузка нескольких файлов».

    Поля класса waRequestFile доступны только для чтения, их значение полностью аналогично таковым в массиве $_FILES :

    Илон Маск рекомендует:  Расширение в Sass

    $file->tmp_name; значение этого поля также можно получить, если привести переменную $file к типу string :

  • $file->error;
  • $file->extension; — расширение файла, полученное из оригинального имени файла.
  • Методы класса waRequestFile :

    • $file->uploaded() — возвращает true , если имела место загрузка файла на сервер (т. е. значение поля input типа file в веб-форме было непустым); в случае если файл не был загружен на сервер (т. е. если возвращает false ), вызов всех остальных методов класса waRequestFile вернёт экземпляр объекта исключения типа waException ;
    • $file->moveTo(‘path/to/file’) перемещает загруженный файл в указанный каталог (аналогично PHP-функции move_uploaded_file() );
    • $file->moveTo(‘path/to/dir’, ‘filename’) то же самое, но с присвоением нового имени загруженному файлу;
    • $file->copyTo(‘path/to/file’) копирует загруженный файл в указанный каталог;
    • $file->copyTo(‘path/to/dir’, ‘filename’) то же самое, но с присвоением нового имени созданной копии файла;
    • $file->waImage() возвращает экземпляр класса waImage для обработки изображения.

    Внимание! Если загруженный файл не является изображением, вызов конструктора waImage() вызовет Exception . Поэтому рекомендуется использовать такой вызов в блоке :

    Подробнее о классе waImage см. раздел «Изображения».

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

    Рассмотрим загрузку файлов через форму с несколькими элементами input типа file с одинаковым именем:

    возвращает экземпляр класса waRequestFileIterator :

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

    Класс waRequestFileIterator реализует интерфейс Iterator ; это означает, что можно использовать цикл foreach для перебора списка загруженных файлов. Каждый элемент в списке представляет собой экземпляр класса waRequestFile , для которого доступны все описанные выше методы:

    Webasyst — это CMS нового поколения, совмещающая в себе инструменты для управления сайтом и интернет-магазином с полезными приложениями для совместной работы с коллегами и взаимодействия с клиентами. Единый центр управления бизнесом через интернет.

    Платформа
    Магазин Webasyst
    Помощь
    • © 2002—2020 Webasyst
    • О компании
    • Блог
    • Договор-оферта
    • Webasyst.com

    Мы получаем и обрабатываем персональные данные посетителей сайта в соответствии с Политикой обработки персональных данных. Отправка персональных данных с помощью любой страницы сайта подразумевает согласие со всеми пунктами Политики.

    Эксплуатация уязвимостей в функциях для работы с файлами в PHP

    Содержание статьи

    PHP предоставляет богатые возможности для работы с файлами. Любой веб-программист сталкивался с функциями fopen, copy, filegetcontents и т. д. Однако далеко не каждый знает о таких довольно эффективных конструкциях, как фильтры и потоки, в которых совсем недавно обнаружились крайне серьезные баги.

    bit.ly/tTtvWV — пример использования класса Lightning-Template.

    bit.ly/mdrdqf — статья, подробно рассказывающая об уязвимости File path injection.

    pastebin.com/1edSuSVN — пример использования уязвимости File path injection.

    bit.ly/g6ztD3 — описание уязвимости, связанной с неправильной обработкой ключей в массиве $_FILES.

    СТАНДАРТНЫЕ ФИЛЬТРЫ

    Прежде чем приступать к описанию новых векторов атак, хочу немного рассказать о фильтрах и потоках, которые появились еще в PHP 4.3 и предоставили скриптам абстрактный слой для доступа к файлам. Различные ресурсы в PHP (сетевые соединения, протоколы сжатия и т. д.) могут рассматриваться как «потоки» данных. Можно последовательно считывать информацию из таких потоков или записывать ее в них. При этом существует ряд зарегистрированных в PHP фильтров, с помощью которых можно модифицировать данные, получаемые из потока. Для того чтобы получить список имеющихся в твоей системе фильтров, достаточно выполнить такой код:

    Сампописный фильтр в девелоперской версии форума phpBB3

    Хакер #156. Взлом XML Encryption

    Чтобы использовать фильтр, его нужно связать с потоком. Это делается с помощью функции stream_filter_append/stream_filter_prepend или же с помощью враппера php://filter . Первый способ предоставляет больше возможностей для работы с фильтрами, но второй более компактен, что тоже обеспечивает определенные преимущества. Вот один пример использования фильтров для кодирования строки:

    А вот пример однострочного скрипта, который получает данные методом POST, кодирует их в Base64 и выводит обратно:

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

    Враппер php://filter также применяется и для обеспечения безопасности веб-приложений. Например, скрипт

    при настройке «allowurlinclude = Off» не позволит злоумышленнику провести атаку RFI. Однако этот скрипт вполне позволяет прочитать локальные PHP-файлы — для этого достаточно послать уязвимому сценарию следующий POST-запрос: inc=php://filter/read%3Dconvert.base64-encode/resource%3D/ path/script.php

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

    ПИШЕМ СВОЙ ФИЛЬТР

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

    Итак, для начала нам нужно считать данные из потока. В дальнейшем мы будем обрабатывать их с сохранением во внутренней переменной «$this->_data»:

    Когда мы прочитаем все данные из потока, параметр $closing примет значение TRUE. Теперь можно их обрабатывать:

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

    Зарегистрированный фильтр доступен из любой функции, поддерживающей потоки.

    Первый пример самописного фильтра

    ПОЛЬЗОВАТЕЛЬСКИЕ ФИЛЬТРЫ

    Пользовательский фильтр — это расширение встроенного класса phpuserfilter. При создании фильтра необходимо задать следующие методы: filter, onCreate, onClose. Первым и самым важным методом является filter, который принимает четыре параметра:

    1. $in — точка входа, ресурс, из которого поступают данные как по «цепочке людей, передающих ведро».
    2. $out — точка выхода, ресурс, в который отдаются обработанные данные.
    3. $consumed — место, где хранится длина данных, полученных фильтром, этот параметр всегда должен передаваться по ссылке.
    4. $closing — булева переменная, регулирующая получение данных, принимает значение TRUE, если считывание данных из входящего потока закончено.

    Также метод filter должен возвращать одну из следующих трех констант:

    1. PSFSPASSON — данные успешно обработаны и переданы в точку выхода.
    2. PSFSFEEDME — ошибки отсутствуют, но данных для передачи в $out нет.
    3. PSFSERRFATAL (default) — произошла ошибка.

    Методы onCreate/onClose применяют редко, но лучше включать их в код фильтра. Если фильтр оперирует другими ресурсами (например, буфером), то это указывается в методе onCreate, вызываемом при инициализации фильтра. Метод onCreate должен возвращать FALSE в случае неудачи и TRUE в случае успеха. Метод onClose вызывается при завершении работы фильтра (обычно во время закрытия потока). Чтобы наш фильтр был доступен, необходимо зарегистрировать его в системе с помощью функции streamfilterregister.

    ПРИВЕТ ИЗ ЯПОНИИ

    Теперь, когда мы научились создавать собственные фильтры, посмотрим, как они применяются в реально существующих скриптах. Воспользуемся для этого сервисом Google Code Search. Будем искать примеры использования функции streamfilterregister. При этом нам должен встретиться довольно интересный класс Lightning-Template (ссылки на сам класс и страницу разработчика ищи в сносках), который мы рассмотрим чуть подробнее. Допустим, у нас есть некий абстрактный шаблон sample.html:

    сгенерит следующую HTML-страницу:

    Пример использования класса Lightning Template

    Таким образом, упомянутый класс по заданным шаблонам генерит соответствующий HTML-код. Хотелось бы сразу отметить, что подключение темплейтов в этом классе происходит через уже знакомую тебе конструкцию include, однако это не самое лучшее решение. Определенные группы пользователей обладают правами на редактирование темплейтов, что позволяет внедрять в них зловредный PHP-код, который успешно выполняется согласно логике данного класса. Самописный фильтр, идущий вместе с классом, как раз и делает всю основную работу по преобразованию HTML-кода. Внесем небольшие изменения в этот фильтр:

    В строке, начинающейся с «‘ , я удалил одинарные кавычки. Это не влияет на функциональность фильтра, но дает нам новые возможности. Изменив фильтр, я добился того, чтобы произвольные команды исполнялись с помощью preg_replace с модификатором «e». Таким образом, если в темплейте есть строка:

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

    Вспоминаем, что один враппер можно подставить в другой. Поэтому наши команды будут успешно выполняться для следующего POST-параметра file:

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

    FILE UPLOAD

    Обычно для загрузки файлов на сервер используют либо функцию moveuploadedfile, либо функцию copy. Довольно часто пользователям разрешается загружать графические изображения, картинки, аватары и т. д. При этом разработчики предусматривают разнообразные процедуры проверки загружаемых файлов, чтобы вместо картинки никто не загрузил полноценный веб-шелл. Чтобы понять, какая проверка действительно эффективна, а какую легко можно обойти, рассмотрим процесс обычной загрузки файла в подробностях.

    Итак, для отправки пользовательского файла используется HTML-форма, например такая:

    Когда мы выбираем файл для загрузки у себя на компьютере и нажимаем кнопку Upload, удаленному серверу отправляется POST-запрос, в котором обязательно содержится хедер Content-Type следующего вида:

    А сами POST-данные имеют такой вид:

    Как несложно догадаться, при заполнении формы мы выбрали файл hello.txt, который содержит « » . Когда PHP-скрипт на удаленном сервере получает этот запрос, интерпретатор PHP создает на сервере временный файл с именем типа phpseUm44, в который и попадает содержимое hello.txt. Этот временный файл хранится до завершения работы скрипта, а потом автоматически удаляется (подробнее о временных файлах в PHP читай в предыдущем номере нашего журнала). Также создается массив $_FILES следующего вида:

    Тут важно понимать, что $_FILES[uploadfile][type] совпадает с элементом Content-Type, который формируется на стороне клиента. Обычно браузер автоматически заполняет этот элемент в зависимости от выбранного файла, поэтому некоторые веб-мастера, наивно надеясь обезопасить себя от загрузки зловредных PHP-скриптов, проводят только вот такую простенькую проверку:

    При этом они забывают, что любой элемент пользовательского запроса можно легко изменить, то есть обойти такого рода фильтр очень просто. Для проверки также довольно часто используется функция getimagesize(). Конечно, это более эффективно, но не стоит забывать, что пользователь с легкостью может изменить EXIF-теги изображения, поэтому такой фильтр также легко можно обойти. Остается открытым вопрос о том, в каком виде файл сохраняется на сервере. Например, в зависимости от настроек веб-сервера файл pic.php.myext вполне может быть обработан как PHP-скрипт. Таким образом, безопасный аплоад файлов — это не только проверки в скриптах, но и грамотно решенный вопрос о местонахождении и обработке загруженных файлов. При этом также не стоит забывать и об особенностях самого PHP, связанных с массивом $_FILES.

    УЯЗВИМОСТИ ЗАГРУЗКИ ФАЙЛОВ

    Первая уязвимость, о которой я бы хотел рассказать, — это недостаточная обработка имени файла при его загрузке. Эта уязвимость помечена на сайте bugs.php.net как приватная, тем не менее если постараться, все-таки можно найти ее описание. �� Баг заключается в том, что если имя файла начинается со слеша или бэкслеша и больше слешей/бэкслешей не содержит, то оно проходит как есть в элемент массива $_FILES[uploadfile][name] . Таким образом, вместо того чтобы загрузить файл в текущую директорию скрипта, мы загрузим его в корневую директорию веб-сервера. На машинах под управлением Unix-подобных систем мы не сможем ничего загрузить в корневую папку из-за нехватки прав. Но вот на Windows-машинах вполне можно провернуть такой финт ушами. По ссылке в сносках ищи обучающее видео из блога первооткрывателя этого бага.

    Вторая уязвимость более существенна. Она обусловлена неправильной обработкой ключей в массиве $_FILES. Впервые о ней я узнал от человека под ником Qwazar с форума rdot.org. Вместе с BlackFan, еще одним камрадом с этого форума, они провели тесты, раскрывающие суть этого бага. С их разрешения я расскажу о нем более подробно. Итак, пусть у нас есть мультифайловая загрузка, реализуемая с помощью функции copy:

    Это позволяет не только загружать файлы, но и читать произвольный контент с сервера! Если мы отсылаем файлы на сервер при помощи вот такой вот формы:

    — то в массиве $_FILES создаются элементы следующего типа:

    Функция copy вполне успешно воспринимает эти элементы:

    Таким образом, мы получаем возможность для манипулирования произвольными параметрами в $_FILES (ниже я покажу, что такое поведение характерно не только для функции copy). Приведу простой пример, чтобы более детально разъяснить суть уязвимости. Если на удаленном сервере имеется вышеуказанный скрипт (назовем его upload.php), а у нас на компьютере есть соответствующая HTML-форма, то для чтения исходника скрипта secret.php, который находится в той же директории, что и upload.php, нам необходимо и достаточно создать у себя на жестком диске два файла: 1. Файл с именем secret.php, содержимое которого не столь важно (пусть, к примеру, это будет « » ). 2. Файл с совсем простым именем, допустим «1». Его содержимое будет состоять из одного символа «1».

    В качестве имени второго файла выбрано число, чтобы он смог пройти следующую проверку:

    Теперь открываем вышеуказанную форму в браузере и в поле «file[tmp_name][» выбираем файл secret.php, а в остальных полях — файл с именем «1». Затем жмем на сабмит и видим, что в той же директории появился файл test.txt. Он представляет собой точную копию файла secret.php, но имеет расширение txt, и значит, мы легко можем просмотреть его в браузере.

    Кстати, чтобы просмотреть файл из произвольной директории, нужно изменить поле Content-Type (то, о котором я говорил выше). В этом поле мы можем указать путь к любому файлу на сервере, и этот файл успешно скопируется в test.txt. Но и это еще не все!

    «БЕЗОПАСНАЯ» ЗАГРУЗКА ФАЙЛОВ НА СЕРВЕР

    Как отмечено выше, в основном загрузка файлов осуществляется с помощью функций moveuploadedfile и copy. Однако существуют и другие варианты для выполнения этой сложной и ответственной задачи. Один из таких вариантов (он, кстати, более предпочтителен, если речь идет о загрузке только изображений) — использование функций imagecreatefrom/image. Так как эти функции работают только с изображениями, то ничего, кроме картинки, мы им подсунуть не сможем. Например, скрипт


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

    Итак, главная особенность функций imagecreatefrom* заключается в том, что они не только работают с графическими файлами, но и вполне себе поддерживают описанные выше потоки! Это открывает, к примеру, прекрасную возможность хранить картинки не на сервере, а в базе данных. Таким образом, если пропустить картинку через base64_encode и сохранить в БД, то потом такое изображение можно будет вывести на экран, например, вот так:

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

    Предположим, что у нас есть веб-приложение, которое имеет описанный выше уязвимый фильтр, а также осуществляет мультифайловую загрузку, но не с помощью функции copy, а с помощью функции imagecreatefrom/image, например такой:

    Создаем на сервере файл 1.jpg c произвольным содержимым, выбираем его во всех полях формы, которую я приводил выше, и отсылаем POST-запрос с модифицированным полем Content-Type:

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

    «Приватная» уязвимость PHP

    НОВАЯ ЖИЗНЬ СТАРЫХ БАГОВ

    В конце 2009 года в PHP уже был найден похожий баг, связанный с неразберихой в ключах глобальных массивов. По задумке разработчиков, в именах GPC-переменных не должны содержаться символы « » (пробела), «.» и «[» (они могут интерпретироваться как элементы специального синтаксиса массивов). Однако версии PHP того времени допускали нарушение логики в образовании таких имен. Чтобы воспроизвести баг, набросаем специальную HTML-форму:

    Также напишем скрипт index.php для вывода результата на экран:

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

    ВМЕСТО ЗАКЛЮЧЕНИЯ

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

    Загрузка методом POST

    PHP способен принимать загрузку файлов из любого RFC-1867-соответствующего браузера (в том числе — Netscape Navigator 3 и новее, Microsoft Internet Explorer 3 с патчем от Microsoft или новее без патча). Это даёт возможность загружать текстовые и бинарные файлы. С помощью функций РНР для аутентификации и манипуляций с файлами вы получаете полный контроль над тем, кому разрешено загружать файлы, и над тем, что делать с файлом после его загрузки.

    Заметьте, что PHP поддерживает также загрузку методом PUT, который используется в Netscape Composer и в Amaya-клиентах W3C. См. также «Поддержка метода PUT».

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

    Пример 19-1. Форма для загрузки файлов

    _URL_ должен указывать на PHP-файл. Скрытое поле MAX_FILE_SIZE обязано предшествовать полю ввода файла/file input field, и его значение это максимальный размер принимаемого файла. Значение в байтах.

    MAX_FILE_SIZE является для браузера лишь уведомляющим. Легко обойти этот максимум. Поэтому не рассчитывайте, что браузер будет повиноваться вашим желаниям! Однако PHP-установки maximum-size обмануть нельзя.

    Переменные, определяемые для загруженных файлов, зависят от версии PHP и конфигурации. Следующие переменные будут определены в скрипте назначения после успешного завершения загрузки. Если track_vars включена, инициализируется массив $HTTP_POST_FILES/$_FILES. Наконец, соответствующие переменные могут быть инициализированы как глобалы, если register_globals включена. Однако использовать глобалы больше не рекомендуется.

    Примечание: track_vars всегда включена, начиная с версии PHP 4.0.3. Начиная с версии PHP 4.1.0, можно использовать $_FILES вместо $HTTP_POST_FILES .
    $_FILES всегда является глобальной, поэтому global не должно использоваться для $_FILES в области видимости функции.

    $HTTP_POST_FILES / $_FILES предоставлены для вмещения информации загруженных файлов.

    Далее идёт содержимое $_FILES . Обратите внимание, что здесь предполагается использование имени ‘userfile’ для загружаемого файла, как в примере скрипта ранее: $_FILES[‘userfile’][‘name’]

    Оригинальное имя файла на клиентской машине.

    mime-тип файла, если браузер предоставил эту информацию. Пример: «image/gif» .

    Размер загруженного файла в байтах.

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

    Примечание: в PHP версии до 4.1.0 она называлась $HTTP_POST_VARS и не была автоглобальной переменной. PHP 3 не поддерживает $HTTP_POST_FILES .

    Если register_globals включена в php.ini , то будут доступны нижеследующие переменные. Обратите внимание, что имена этих переменных предполагают использование имя файла для загрузки ‘userfile’, как в примере предыдущего скрипта:


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

    $userfile_name — Оригинальное имя или путь к файлу на системе отправителя.

    $userfile_size — Размер загруженного файла в байтах.

    $userfile_type — mime-тип файла, если браузер предоставил эту информацию. Пример: «image/gif» .

    Заметьте, что часть » $userfile » этих переменных это имя, которое записано в поле type=»file» в форме загрузки. В предыдущем примере формы мы назвали её «userfile».

    Примечание: register_globals = On не рекомендуется по соображениям производительности и обеспечения безопасности.

    Файлы будут по умолчанию сохраняться во временной директории по умолчанию на сервере, если только не задано другое место директивой upload_tmp_dir в php.ini . Директория по умолчанию сервера может быть изменена через установку переменной окружения TMPDIR в среде, в которой работает PHP. Установка её с использованием putenv() из РНР-скрипта не будет работать. Эта переменная окружения может также использоваться для того, чтобы гарантировать, что другие операции также работают с загруженными файлами.

    Предупреждение!

    Пример 19-2. Проверка загрузки файлов

    Следующие примеры предназначены для версий PHP 4 выше 4.0.2. См. о функциях is_uploaded_file() и move_uploaded_file() .

    PHP-скрипт, который получает загружаемый файл, должен реализовывать логику, необходимую для определения того, что нужно сделать с загруженным файлом. Вы можете, например, использовать переменную $_FILES[‘userfile’][‘size’] для исключения файлов, которые слишком малы или велики. Вы можете использовать переменную $_FILES[‘userfile’][‘type’] для исключения файлов, которые не отвечают критериям определённого типа. При любой логике вы должны либо удалять, либо перемещать такие файлы из временной директории.

    Файл будет удалён из временной директории по окончании запроса, если он (файл) не перемещён или не переименован.

    Обработка загрузки файлов

    Для запуска обработки нужно:

    Запустить Демонстрационную конфигурацию «Библиотека стандартных подсистем».

    Обработка должна запускаться в тонком клиенте на компьютере, работающем под управлением Microsoft Windows и на котором установлен Microsoft Excel.

  • Выбрать пользователя и войти в конфигурацию. Для проверки корректности обработки рекомендуется войти от имени обычного пользователя (не администратора).
  • Выбрать раздел Интегрируемые подсистемы.
  • Выбрать команду Демо: Дополнительные обработки (под надписью Сервис).
  • В выведенном окне Дополнительные обработки (Раздел «Интегрируемые подсистемы») выбрать имя нужной команды: Выгрузить порционную загрузку документов «_ДемоСчетНаОплатуПокупателю» из Excel-файла.
  • Нажать кнопку Выполнить.
  • Использование обработки

    После того, как обработка запущена, необходимо:

    Указать имя папки с загружаемыми Excel-файлами в поле Выберите папку с файлами для загрузки.

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

    Нажать кнопку Загрузить данные. Выполнение загрузки будет отображаться в полоске-индикаторе:

    По окончании загрузки данных будет выдано сообщение «Загрузка данных завершена». В нем следует нажать кнопку OK.

    Просмотр результатов выполнения обработки

    Для просмотра результатов выполнения обработки следует нажать гиперссылку Открыть список документов «Демо: Счета на оплату покупателям»

    Будет выведен справочник Демо: Счета на оплату покупателям, в который обработка загружает данные из Excel-файлов.

    Данные для обработки

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

    Такие файлы можно подготовить в самой обработке. Для этого следует:

    1. Создать документы в справочнике Демо: Счета на оплату покупателям (доступном в разделе меню Интегрируемые подсистемы).
    2. Выделить в справочнике Демо: Счета на оплату покупателям документы, по которым требуется создать Excel-файлы.
    3. Нажать кнопку Печать и выбрать в выведенном меню пункт Счет на оплату.
    4. В открывшейся форме Печать документов нажать кнопку .

    В выведенном окне Сохранение печатной формы:

    1. установить режим Сохранить в папку на компьютер;
    2. указать путь к папке, куда будут сохранены файлы;
    3. в списке В форматах отметить пункт Лист Microsoft Excel 2007 (.xlsx);
    4. нажать кнопку Сохранить.

    Отладка и изменение обработки

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

    1. С помощью Конфигуратора включить внешнюю обработку в состав конфигурации.
    2. Выполнить отладку, запуская обработку через меню Все функции.
    3. Сохранить отлаженную/измененную обработку как внешнюю обработку.
    4. Удалить отлаженную обработку из состава конфигурации
    5. Использовать отлаженную внешнюю обработку в подсистеме Дополнительные отчеты и обработки, как это описано выше.
    Илон Маск рекомендует:  Что такое код mysql_errno
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL