Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Java: внутри файла MS Excel 2007. Часть четвёртая   В публикуемой сегодня части статьи заканчивается описание процедур загрузки электронной таблицы и начинается описание самого интересного - каким образом получить данные, хранящиеся в ячейках таблицы
Шаблоны и примеры Читать статью
 
Java: внутри файла MS Excel 2007. Часть третья   В предлагаемой вниманию читателя третьей части статьи о структуре файла электронной таблицы Microsoft Excel формата 2007 речь идёт о коде Java, "разархивирующем" файловый поток и формирующем объекты, с которыми предстоит взаимодействовать при дальнейшей обработке данных электронной таблицы
Шаблоны и примеры Читать статью
 
Java: внутри файла MS Excel 2007. Часть вторая   В настоящем материале автор постарается систематизировать свои знания о том, как устроено хранение данных электронной таблицы, и презентовать небольшую Java-библиотеку, предоставляющую возможность чтения данных и заполнения файла электронной таблицы Microsoft Excel
Шаблоны и примеры Читать статью
 


Советы

Главная   Библиотека   Советы

Размещение элемента Upload control (Поле вложения) как элемента HTML-кода

Александр Чудилин
Элемент дизайна File upload control (в пятой русифицированной версии - Поле вложения) используется в приложениях, ориентированных на Web, для присоединения к документу файлов при работе из web-браузера

Стандартная процедура размещения элемента в форме, предусматривающая конвертацию элемента дизайна Notes в соответствующий тег HTML-кода, описана в Designer Help в разделе APPLICATION DESIGN\Designing Forms\Adding a file upload control
Согласно этому описанию, для размещения Upload Control в форме следует воспользоваться командой Главного меню Create -> Embedded Element -> File upload control (Создание -> Внедренный элемент -> Поле вложения)
В результате фрагмент HTML-кода соответствующей web-страницы содержит тег элемента
<INPUT TYPE=file NAME="%%Filebd65291fe9eaadbac4256d6e00439ae5.$Body.0.15C">
Причем значение атрибута NAME имеет следующую структуру %%File<UNID формы>.$Body.<смещение в форме(в поле $Body элемента дизайна)>, и, в соответствии с этим, находится в зависимости от положения элемента Upload control в форме. Любое изменение расположения элементов формы приводит к изменению этого значения
Замечание. В Domino версии 6 изменилась структура значения атрибута, причем без обратной совместимости. В связи с этим приходится рассматривать приводимое решение (но, по большому счету, не алгоритм решения) отдельно для каждого случая
Значение атрибута NAME для версии R6 формируется следующим образом: %%File.<ReplicaID базы данных>.<UNID формы>.$Body.<смещение в форме(в поле $Body элемента дизайна)>. Для вычисления значения этого нового элемента атрибута можно использовать функцию @ReplicaID
В прилагаемом примере (скачать >>>) реализован код для пятой версии Domino
Автору пришлось решать задачу размещения элемента Upload control непосредственно в виде HTML-тега
Понятно, что получение значения атрибута в данном случае - казалось бы, сложная задача... если не обратить внимание, что при размещении элемента Upload control значение атрибута NAME вычисляется с использованием идентификатора подформы и смещения элемента внутри нее и никоим образом не зависит от размещения подформы и прочих элементов внутри формы
Таким образом, достаточно один раз подготовить подформу с элементом Upload control и затем ее использовать в различных формах

Алгоритм решения задачи:
1. Подготовить подформу с Upload control и "подглядеть" значение атрибута NAME:
1.1. Создать подформу UploadSubform, разместить в ней Upload control.
1.2. Создать произвольную форму TestUpload. Внедрить в нее подформу UploadSubform.
1.3. Сохранить форму
1.4. Открыть форму в браузере (URL http://server/filepath/testupload?OpenForm).
1.5. Выбрать опцию просмотра HTML-кода:
1.6. Найти тег:<INPUT TYPE=file ...>
<INPUT TYPE=file NAME="%%File4faea516ad8a79d1c4256d9e0038d491.$Body.0.76">
Это и есть HTML-код элемента. Он не будет меняться, если не меняется подформа UploadSubform.

2. Подготовить форму, по которой будут создаваться документы с присоединяемыми файлами.
2.1. Создать форму AttachmentForm. Разместить в форме нужные элементы дизайна и элементы оформления.
2.2. Разместить подформу UploadSubform. Теперь не играет роли, в какое место формы она попадет

3. Подготовить страницу с HTML-кодом.
Например:
<form method=post action="/path/db.nsf/AttachmentForm?CreateDocument" ENCTYPE="multipart/form-data">
<h2>File upload</h2>

Document name <input type=text name="DocName"><p>
Select file <INPUT TYPE=file NAME="%%File4faea516ad8a79d1c4256d9e0038d491.$Body.0.76">
<input type=submit>
</form>

Весь этот текст помечается как HTML (через пункт Главного меню Text -> Pass-Thru HTML).

При открытии этой страницы (URL-запрос http://server/filepath/имя_страницы?OpenPage), web-пользователь увидит поля для ввода имени файла. При нажатии на кнопку Submit создастся документ по форме AttachmentForm и указанный пользователем файл присоединится к этому документу.



Что дальше?

Что еще может пожелать разработчик в процессе развития данной задачи?

1. Вложения, полученные из интернет, не привязываются к конкретному полю и висят внизу документа. Как их скрыть?
Разместите в форме, по которой отображается документ, вычисляемое при открытии скрытое поле $V2AttachmentOptions со строковым значением "0".


2. Как узнать количество, имена, размеры вложений?
(см. подробности в Domino Designer Help)
Формулы: @Attachments, @AttachmentNames, @AttachmentLengths
LotusScript:
Forall Item In doc.Items
If Item.Type = ATTACHMENT Then
FileName = Item.Values(0)
End If
End Forall



3. Как переместить вложение из интернет в RT-поле?
Предлагается использовать следующий алгоритм: фоновым агентом файл отцепляется во временный каталог, затем вкладывается в поле.
Такого агента можно вызывать, например, на событие WebQuerySave формы AttachmentForm.

Код LotusScript
Function WebMoveAttachment ( doc As NotesDocument, Byval moveToFieldName As String )
'--Функция перемещает файлы, вложенные в документ через элемент Upload Control в форматируемое поле документа

    Dim session As New NotesSession
    Dim v2File As NotesItem
    Dim rtItem As NotesRichTextItem
    Dim inputAttachment As NotesEmbeddedObject
    Dim tempDirectory As String
    Dim fileName As String
    Dim filePath As String

    Set v2File = doc.GetFirstItem ( "$File" )
    fileName = v2File.Values(0)
    Set inputAttachment = doc.GetAttachment ( fileName )

'--Определение пути к каталогу для временного сохранения файла
    tempDirectory = session.GetEnvironmentString ( "Directory", True )
    filePath = tempDirectory + "\" + fileName
' разделитель имени в файловой системе - в коде используется пример для Windows

'--Извлечение файла в файловую систему
    Call inputAttachment.ExtractFile ( filePath )

'--Удаление файла из документа
    Call doc.RemoveItem ( "$File" )

'--Создание форматируемого поля в документе и размещение в нем файла
    If doc.HasItem ( moveToFieldName ) Then
Set rtItem = doc.GetFirstItem ( moveToFieldName )
'--В созданное поле можно добавить не только файл, но и текст, или, как ниже, - две пустые строки
rtItem.AddNewLine(2)
    Else
Set rtItem = New NotesRichTextItem ( doc, moveToFieldName )
    End If

    Set inputAttachment = rtItem.EmbedObject ( EMBED_ATTACHMENT, "",FilePath )

'--И, наконец, удаление файла из файловой системы
    Kill FilePath

End Function


Вызов описанной функции из события Initialize агента

Sub Initialize

    Dim session As New NotesSession
    Dim doc As NotesDocument
    Set doc = session.DocumentContext

    '--Вызов функции для перемещения файла
    Call WebMoveAttachment ( doc, "AttachedFile" )

    '--Сохранение документа
    Call doc.Save ( True, True )

End Sub




4. Несколько Upload Control в одной форме. Как разложить загруженные файлы по соответствующим RT-полям?
Проблема в том, что порядок имен загруженных файлов не сохраняется. Как определить - в каком File Upload какой аттачмент лежит?
Решение (by Natalia G. Kozlova):

У FileUpload Control можно задать идентификатор. Затем, используя функцию JavaScript записывается название вложенного файла в скрытое текстовое поле (каждому FileUpload Control соответствует свое поле), а дальше все просто.

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




5. Как сделать ссылку на вложение (URL)?
Описание можно найти в соответствующем разделе Domino Designer Help: APPLICATION DESIGN\Designing A Web Site\URL commands for opening attachments, image files, and OLE objects

Один из вариантов ссылки на вложение в документ: http://hostname/path/db.nsf/view/docname/$File/AttachmentFileName

Примечание (by Nick A Norkin):
"при использовании функции @AttachmentNames для формирования URL-ссылок я бы еще рекомендовал преобразование @URLEncode("Domino"; <имя файла без расширения>) + "." + <расширение файла>, если существует возможность наличия файлов с русскими именами"

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



Благодарности

  • Благодарю Андрея Фирсова за вовремя подкинутую ключевую идею,
  • компанию "ИнтерТраст" за форум,
  • и все сообщество российских разработчиков Lotus за моральную поддержку и здравые идеи ;)
     
      Опубликовано — 12/14/2003 |    
Владимир, 20.05.2004:
Очень интересное решение!



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :

Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Lotus notes и ЭЦП
29.09.2017 17:16:14
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
 
© LOGOSPHERE.RU