Перейти к содержимому


Хранение файлов не в БД, а в каталоге


Сообщений в теме: 16

#1 vasiliy.zorenko

    Активный участник

  • Пользователи
  • PipPipPip
  • 31 сообщений

Отправлено 29 Январь 2011 - 17:18

Возможно как-то хранить файлы не в базе данных, а просто как файл в файловой системе?
Естественно, чтобы CRM сама разруливала куда она ложит файл и сама формировала ссылку на скачивание.


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

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 31 Январь 2011 - 10:08

Просмотр сообщенияvasiliy.zorenko (29.1.2011, 17:18) писал:

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

Просмотр сообщенияvasiliy.zorenko (29.1.2011, 17:18) писал:

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

#3 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 11 Февраль 2011 - 14:12

А можно чуть подробнее описать алгоритм данного вычисления?

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 14 Февраль 2011 - 10:55

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

1. Проверяем, загружены ли файлы в поле с типом "файл". Для этого Вам необходимо проверить содержимое этого поля - там хранятся названия загруженных файлов. Если они там есть - читаем файлы из БД и переносим их в нужный Вам каталог. Фрагмент кода для чтения файла из БД:
$sqlQuery = "SELECT * FROM ".DATA_FILES_TABLE." WHERE table_id=".$table_id." AND field_id=".$field_id." AND line_id=".$line_id." AND name='".$name."' ORDER BY id";
$result = mysql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
while ($row = mysql_fetch_array($result))
{
  $content.= $row['content'];
}
(цикл while необходим т.к. файл хранится фрагментами по 500 кБ)

Здесь $table_id, $field_id, $line_id - соответственно id таблицы, поля и записи, в которые был загружен файл, $name - имя загруженного файла (берете из поля).

2. Записываете содержимое переменной $content в файл в нужном Вам каталоге. Алгоритм стандартный для php.

3. Формируете ссылку на файл в каталоге и записываете ее во второе (текстовое) поле.

4. Удаляете файл из БД (чистите содержимое поля типа "файл" и удаляете соответствующие записи из таблицы data_files)

#5 tel

    Активный участник

  • Пользователи
  • PipPipPip
  • 187 сообщений

Отправлено 15 Февраль 2011 - 00:21

а если будет нужно удалить этот файл? из базы его как удалить?

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 15 Февраль 2011 - 09:21

Просмотр сообщенияtel (15.2.2011, 0:21) писал:

а если будет нужно удалить этот файл? из базы его как удалить?
$sqlQuery = "DELETE FROM ".DATA_FILES_TABLE." WHERE table_id=".$table_id." AND field_id=".$field_id." AND line_id=".$line_id." AND name='".$name."'";
mysql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);


#7 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 21 Февраль 2011 - 04:11

Спасибо за предоставленную информацию. Написал вычисление, размер базы существенно уменьшился...

#8 tel

    Активный участник

  • Пользователи
  • PipPipPip
  • 187 сообщений

Отправлено 21 Февраль 2011 - 21:45

может поделитесь и даже готов заплатить за этот код.

#9 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 24 Февраль 2011 - 00:51

Просмотр сообщенияtel (21.2.2011, 21:45) писал:

может поделитесь и даже готов заплатить за этот код.
пишите или на мыло. контакты в профиле.

#10 serg499

    Активный участник

  • Пользователи
  • PipPipPip
  • 109 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 18 Апрель 2012 - 22:00

Актуальная тема, но если с пунктом 1 все понятно (http://clientbase.ru...findpost&p=5765), то про 2, 3, 4 - хотелось бы узнать поподробнее - распишите, пожалуйста!

#11 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 19 Апрель 2012 - 02:24

Попробовал ввести код, приведенный в п.4 - выдает ошибку, что таблицы с файлами не существует. Очевидно в 1.9.5 этот код не будет работать.
Применил следующий вариант:
//Создаем папку для текущей заявки
$text = substr($line['Дата'], 2, 2)."_".$line['Номер_ID']." ".$line['Клиент']['Название'];
$line['Папка'] = mb_convert_encoding("D:\\_Заявки\\".$text, 'cp1251', 'auto');
if (!file_exists($line['Папка']))
    mkdir($line['Папка']);
   
//Перемещаем файл в папку данной заявки
$full_dir = get_file_path(908, $ID, $line['Файл']);
rename($full_dir, $line['Папка']."\\".mb_convert_encoding($line['Файл'], 'cp1251', 'auto'));
Т.е. сначала создаем папку для заявки, а затем перемещаем туда файл, загруженный в поле с названием "Файл" типа "файл". Все отлично перемещается. Код пока пробный, надо будет вводить проверки на наличие файла, а если несколько файлов и т.д. Но никак не могу сообразить как в таблице убрать старую ссылку на файл и сделать новую.

Просмотр сообщенияCbCoder (14 Февраль 2011 - 10:55) писал:

3. Формируете ссылку на файл в каталоге и записываете ее во второе (текстовое) поле.
4. Удаляете файл из БД (чистите содержимое поля типа "файл" и удаляете соответствующие записи из таблицы data_files)
Можно привести пример кода, как это будет выглядеть для 1.9.5.
Спасибо

#12 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 19 Апрель 2012 - 10:02

Просмотр сообщенияserg499 (18 Апрель 2012 - 22:00) писал:

Актуальная тема, но если с пунктом 1 все понятно (http://clientbase.ru...findpost&p=5765), то про 2, 3, 4 - хотелось бы узнать поподробнее - распишите, пожалуйста!
У вас какая версия? В версии 1.9.5 файлы уже изначально хранятся на диске (в файловой системе), а не в базе данных. Данное вычисление было актуально для предыдущих версий.

#13 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 19 Апрель 2012 - 10:06

Просмотр сообщенияarsenal (19 Апрель 2012 - 02:24) писал:

Попробовал ввести код, приведенный в п.4 - выдает ошибку, что таблицы с файлами не существует. Очевидно в 1.9.5 этот код не будет работать.
Разумеется не будет, и не должен - я вам в соседней теме уже раза три написал что файлы в версии 1.9.5 не хранятся в базе.

Просмотр сообщенияarsenal (19 Апрель 2012 - 02:24) писал:

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

#14 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 19 Апрель 2012 - 10:38

Просмотр сообщенияCbCoder (19 Апрель 2012 - 10:06) писал:

Какой смысл перемещать файлы в программе из одной папки в другую? Данное вычисление было написано для перемещения файлов из базы и по этой причине неактуально для 1.9.5.
У меня есть таблица "Заявки" и таблица "Договора". К ним идет масса связанных таблиц с документами, в которых прикладываются сканы. При создании заявки или договора автоматически создается папка для хранения в ней разных файлов, касающихся заявки или договора. Хотелось бы, чтобы при загрузке файлов (сканов) в таблицы, сами файлы автоматически попадали в соответствующие папки. Т.е. все файлы, касающиеся конкретного договора или заявки, хранятся в одном месте.

#15 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 19 Апрель 2012 - 14:35

Пришла в голову бредовая идея. Могу ли я переписать функции в файле "functions1.php", отвечающие за формирование пути к файлам (get_file_hash(), get_file_path(), create_data_file_dirs()), чтобы они формировали нужные мне пути? Возможно ли это в принципе?

#16 Analitic

    Активный участник

  • Пользователи
  • PipPipPip
  • 700 сообщений
  • Пол:Мужчина

Отправлено 19 Апрель 2012 - 14:42

В принципе возможно. Но зачем? Также не забываем про бекапы, они жестко забиты на папку files.

#17 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 356 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 21 Май 2012 - 11:55

Ранее, при обновлении новой версии, админ просто удалял папку cb и заливал новый дистрибутив. Та же методика использовалась при некорректном обновлении программы. Сейчас файлы лежат отдельно от базы, т.е. шаги, описанные выше, просто удалят всю информацию. Возможно, как вариант, при установке дистрибутива создавать две папки? Одна основная cb, вторая cb_data, например- для хранения настроек (config.php) и для хранения данных, включая бэкапы.

Творческая группа "ТАВР".

www.TAVR.pro Художественная ковка, металлоконструкции.

www.СтолМет.рф Складные столы, стулья и системы для их хранения






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных