Опишу свою методику, она на 100% применима для данного случая. Единственное исключение - файл хранится в текстовом поле. Использую MySQL. В базе данных сохраняются *.pdf файлы некоторых отчетов. Данные храню в двух таблицах. Первая - описание параметров отчета, вторая - данные отчета (несколько записей на один файл, количество записей зависит от размера файла и размера поля). Содержимое файла хранится в текстовом (шестнадцатеричном) виде. Структура таблиц следующая:
/*=============================================================================
Таблица имеющихся файлов
=============================================================================*/
CREATE TABLE IF NOT EXISTS `files_info`
(
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор записи',
`CREATED` datetime DEFAULT NULL COMMENT 'Время создания записи',
`USER_NAME` TEXT COMMENT 'Оператор',
`PROC_DATE` datetime DEFAULT NULL COMMENT 'Дата поверки',
`REP_NUMBER` int(10) unsigned NULL COMMENT 'Номер отчета',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET='UTF8' COMMENT='Таблица имеющихся файлов';
/*=============================================================================
Таблица данных(содержимого) файлов
=============================================================================*/
CREATE TABLE IF NOT EXISTS `files_data`
(
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор записи',
`FILE_ID` int(10) unsigned DEFAULT NULL COMMENT 'Идентификатор файла',
`DATA` TEXT COMMENT 'Данные файла',
PRIMARY KEY (`ID`),
CONSTRAINT `FK_4` FOREIGN KEY (`FILE_ID`) REFERENCES `files_info` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET='UTF8' COMMENT='Таблица данных файлов';
Алгоритм сохранения файла следующий:
1. Создаю запись о файле в таблице files_info, получаю ID записи
2. Частями считываю файл в бинарном виде, конвертирую в строку в шестнадцатеричном виде
3. Создаю запись с данными файла в таблице files_data, FILE_ID = идентификатор записи о файле
4. Повторить пп 2-3 пока файл не будет считан и сохранен в БД полностью
Почему использовано данное решение:
1. Работа с базой данных через хранимые процедуры
2. Использование функции MySQL LOAD_FILE(...) невозможно, т.к. клиент и сервер разные машины и нет возможности скопировать файл на сервер. Фунция LOAD_FILE(...) помещает в базу только файлы, расположенные на той же машине, на которой запущен сервер MySQL
Плюсы:
-малое расходование ресурсова
Минусы:
-требуется время на конвертирование данных файла