вторник, 11 августа 2009 г.

Ограничение на размер прикрепляемых к карточке файлов

Часто приходит вопрос - можно ли ограничить размер прикрепляемого к карточке файла? Цель понятна. Даже если используется FileStream администрировать базу в сотни гигабайт, большую часть из которых составляют отсканированные в 2400 dpi *.bmp картинки мягко говоря не удобно.

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

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

Карточка документа -- Список файлов -- Карточка файла -- Карточка файла с версиями -- Файл.

чертой обозначена ссылка.

Карточка "Список файлов" хранит ссылки на карточки файлов, поэтому в ней навряд-ли хранится размер. Поэтому, смотрим на схему карточки файла. Вот удача! В секции "Основная информация" есть поле FileSize. Обытным путем устанавливаем, что это поле хранит размер в килобайтах. Остается только написать скрипт, который будет по ссылкам из списка файлов получать карточки файлов и суммировать размер.



Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
' Check size of all files

MaxSize = 1024 ' max size of files in KB

' Get FileList Card
Set MainRow = CardData.Sections(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
If Not IsNull(MainRow.Value("FilesID")) Then
FilesID = CStr(MainRow.Value("FilesID")) ' if card has a FileList
Else
Exit Function ' exit
End If
Set FileList = UserSession.CardManager.CardData(FilesID)

' Get FileCard and size

Set FileRefs = FileList.Sections(FileList.Type.Sections.GetByAlias("FileReferences").ID).Rows

SummSize = 0
For Each SingleRow In FileRefs
CardFileID = CStr(SingleRow.Value("CardFileID"))
Set CardFile = UserSession.CardManager.CardData(CardFileID)
Set CardFileMainRow = CardFile.Sections(CardFile.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
SummSize = SummSize + CInt(CardFileMainRow.Value("FileSize"))
Next

If SummSize > MaxSize Then
DoEvent = -1

CardFrame.ShowMessage "Внимание", "Превышен допустимый размер приложенных файлов", , 3
End If
End Function


Данный скрипт нужно разместить на событие "Закрытие" карточки. Если размер файлов превышен, карточка не будет закрываться.

2 комментария:

  1. Спасибо большое за идею, вопрос действительно часто задаваемый. Теперь можно хотя бы в карточках документов, задач ввести такое ограничение.
    А ограничивать расширение можно?
    Что-то не удаётся найти, хранится ли оно где-нибудь. В 4.0. в таблице dvsys_files была колонка Ext - там, вроде, хранились расширения файлов. А в 4.1. такого поля уже нет, в 4.3 - тоже не видно.

    ОтветитьУдалить
  2. В карточке файла есть поле с именем (сейчас нет под рукой CardManager'а). Имя вместе с расширением, его можно "откусить".

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

    ОтветитьУдалить