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

Материал из Eludia
Перейти к: навигация, поиск

В Eludia-приложениях загружаемые файлы, как правило, располагаются в подкаталогах директории docroot/i/upload, а справочная информация о них – в таблицах БД в виде четвёрок полей:

  • путь относительно docroot;
  • имя файла, показываемое клиенту;
  • MIME-тип;
  • размер в байтах.

В случае использования Eludia.pm с БД Oracle наш стандартный API поддерживает хранение содержимого файлов в БД. В таком случае к четырём перечисленным полям добавляется пятое: тело файла, типа BLOB. Хранение файлов в BLOB-полях MySQL невозможно осуществить эффективно, так как там не реализовано последовательное чтение и запись данных с ограниченным буфером (возможно, этот недостаток будет исправлен в ходе реализации проекта http://www.blobstreaming.org). MS SQL предоставляет необходимую функциональность, однако на момент написания настоящей документации она не адаптирована в API Eludia.

Если на каждую запись таблицы приходится один файл (например, скан документа), то эти поля называются file_path, file_name, file_type, file_size и file_body соответственно, если же файлов несколько (фото и образец подписи сотрудника), то к указанным именам приписываются тематические префиксы.

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

upload

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

	sql_upload_file ({
		name => 'file',
		dir => 'upload/images',
		table => $my_table,
		file_name_column => 'file_name',
		size_column      => 'file_size',
		type_column      => 'file_type',
		path_column      => 'file_path',
#		body_column      => 'file_body',
	});

Для множественных файловых полей предусмотрена аналогичная функция (имена колонок таблицы фиксированы, имя же таблицы указывается в поле формы и передаётся через hidden):

	sql_upload_file ({
		name => 'file',
		dir => 'upload/images',
	});

При хранении файлов в директориях процедура sql_upload_file записывает каждый файл под новым уникальным именем, что исключает возможность конфликтов. А при втором и далее обновлениях одной записи старая версия файла каждый раз стирается. Внутри указанной директории имеются подкаталоги 3 уровней: для года, месяца и дня. Непосредственно файл записывается не в директорию upload/images, а, например, в upload/images/2009/01/09. Все директории при необходимости создаются автоматически. Наличие прав на запись устанавливается для директории i/upload на этапе загрузки ядра, то есть в тот момент, когда WEB-сервер работает с привилегиями администратора.

Для имени поля 'file' do_update_DEFAULT выполнит загрузку файла(ов) автоматически, иначе вам следует самостоятельно вписывать вызовы sql_upload_file и/или sql_upload_files в do_update_$_REQUEST{type}.

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

Такое решение может быть принято и если загружаемые файлы предназначены не для хранения, а для импорта данных. Однако и в этом случае мы рекомендуем оставлять их копии для того, чтобы спустя месяц-другой можно было без проблем предъявить то, что было предоставлено в качестве источника внешних данных. Удобно на этот случай завести таблицу вроде "журнал импорта" с полями "дата/время", "файл" и, возможно, "источник" (подразделение, организация и т. п.).

Если вы, напротив, желаете сохранить стандартным образом в Oracle BLOB-поле файл, не полученный из POST-запроса, а, например, сгенерированный вашим приложением, можно воспользоваться функцией sql_store_file.

download

С одной стороны, бинарный файл для WEB-приложения — это просто статика и может высылаться клиенту соответствующим образом. Однако есть несколько причин, по которым так нельзя поступать при проектировании информационных систем:

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

Процедура sql_download_file обеспечивает выдачу клиенту бинарного содержимого, ранее записанного при помощи sql_upload_file. При этом используется ограниченный буфер памяти (большой файл не может вызвать переполнения) и поддерживается режим загрузки по частям (заголовок Content-Range).

Процедура sql_download_file используется в стандартном обработчике do_download_default, активизируемом по ссылке на поле типа file в режиме просмотра (то есть при истинном значении $_REQUEST {__read_only}).

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Разработчику
Администратору
Инструменты