Сие должно было опубликоваться на NotesNet.ru, но поскольку еще не выложено (может даже еще не посмотрено ;( ), а народ интересуется, то будет запостено сюда ;).
Собственно, это статья по мотивам указанного Андреем постинга. Еще раз ему спасибо ;)
PS. файл с примером толстый получился (130к). На радостях пару картинок там приаттачил, перепаковывать лень. Ну извините ;)
PPS. Подозреваю, Паше придется все равно немного попыхтеть, чтоб сделать ссылку с картинкой...
Upload control by HTML.
Александр Чудилин, chudilin@mail.ru
Самара, 2003
Тематика: Разработка Web-приложений
Версия: Lotus Notes/Domino 5.0.8. На других не тестировалось. Однако подозреваю, что работает на 5.xx.
Статус: workaround
Постановка задачи
Необходимо реализовать Upload control (в терминах Notes - присоединение к документу, attachment) с помощью HTML-формы.
Суть проблемы
Как это делается в Domino Designer в соответствии с документацией
Процедура описана в Designer Help в разделе: APPLICATION DESIGN\Designing Forms\Adding a file upload control
А именно: меню Create - Embedded Element - File upload control
Что получаем в Web:
<INPUT TYPE=file NAME="%%Filebd65291fe9eaadbac4256d6e00439ae5.$Body.0.15C">
Такой вид имени поля характерен для вложений в форматируемых полях Notes. Причем значение атрибута NAME меняется в зависимости от положения элемента Upload control в нотусовой форме. Любое несоответствие этого значения положению элемента в нотусовой форме приведет к ошибке при попытке загрузить файл.
Что хочется
А хочется всего лишь написать
<INPUT TYPE=file NAME="MyUploadControl">
для формирования работающего Upload control. Другими словами, важно, чтобы значение параметра NAME="..." не менялось при изменении Notes-формы. Т.е. так, как это делается с обычными полями, где главное требование - чтобы для любого поля в HTML-форме имелось соответствующее (с тем же названием) в Notes-форме.
Решение
Основная идея решения
Оказывается, если нотусовый элемент Upload control содержится в подформе, значение его HTML-атрибута NAME остается постоянным и не зависит от положения подформы в форме. Таким образом, достаточно один раз подготовить подформу с элементом Upload control и затем ее использовать в различных формах.
Схема решения
1. Подготовим подформу с Upload control и узнаем HTML-код поля:
1.1. Создаем подформу UploadSubform, вставляем в нее Upload control.
1.2. Создаем произвольную форму TestUpload. Внедрим в нее подформу UploadSubform.
Сохраним и посмотрим форму в браузере.
Откроем просмотр HTML-кода:
Ищем тег:<INPUT TYPE=file ...>
<INPUT TYPE=file NAME="%%File4faea516ad8a79d1c4256d9e0038d491.$Body.0.76">
Это и есть HTML-код нашего элемента. Он не будет меняться, если мы не меняем подформу UploadSubform.
2. Подготовим нотусовую форму для присоединений.
Создаем форму AttachmentForm. Эта форма предназначена для создания документов, содержащих наши присоединения.
Наполняем форму любыми необходимыми полями и оформлением. Не забываем вставить подформу UploadSubform.
Теперь нам не важно, куда ее вставлять. ;)
Сохраняем.
3. Подготовим HTML-форму.
Удобно поместить этот HTML-код в подформу. Так и поступим.
Создаем подформу HTMLUploadForm.
Наполняем ее необходимым HTML-кодом. Вставляем <INPUT TYPE=file NAME="%%File4faea516ad8a79d1c4256d9e0038d491.$Body.0.76"> .
Не забываем пометить весь этот текст как HTML (выделит и меню Text / Pass-Thru HTML).
Теперь эту подформу можно вставлять в любую форму. Web-пользователь увидит поля для ввода имени файла. При нажатии на кнопку Submit создастся документ по форме AttachmentForm и указанный пользователем файл присоединится к этому документу.
2. Как узнать количество, имена, размеры вложений?
Ищем в Help.
Формулы: @Attachments, @AttachmentNames, @AttachmentLengths
LotusScript:
Forall Item In doc.Items
If Item.Type = ATTACHMENT Then
FileName = Item.Values(0)
End If
End Forall
Примечание (by Nick A Norkin):
"для русских названий файлов я бы еще рекомендовал сделать @URLEncode("Domino"; <имя файла без расширения>) при показе пользователю"
3. Как переместить вложение из интернет в RT-поле?
Схема следующая: фоновым агентом файл отцепляется во временный каталог, затем вкладывается в поле.
Такого агента можно повесить, например, на WebQuerySave формы AttachmentForm.
Код LotusScript
Function WebMoveAttachment ( doc As NotesDocument, Byval moveToFieldName As String )
'--This function moves a file attached via the Web with the File Upload Control to a rich text field.
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 )
'--CUSTOMIZE the tempDirectory below if you want to save the file to a different directory
tempDirectory = session.GetEnvironmentString ( "Directory", True )
filePath = tempDirectory + "\" + fileName
'--Save the file on the server
Call inputAttachment.ExtractFile ( filePath )
'--Delete the original attachment
Call doc.RemoveItem ( "$File" )
'--Create the rich text item and re-attach the file
If doc.HasItem ( moveToFieldName ) Then
Set rtItem = doc.GetFirstItem ( moveToFieldName )
'--CUSTOMIZE the code below if you want to add a couple of lines to the rich text field before re-attaching the file
'--rtItem.AddNewLine(2)
Else
Set rtItem = New NotesRichTextItem ( doc, moveToFieldName )
End If
Set inputAttachment = rtItem.EmbedObject ( EMBED_ATTACHMENT, "",FilePath )
'--Finally, delete the file from the server file system
Kill FilePath
End Function
Here is an example of how you would call the function above from the Initialize event:
Sub Initialize
Dim session As New NotesSession
Dim doc As NotesDocument
Set doc = session.DocumentContext
'--Call the function to move the attachment ( doc, moveToFieldName )
Call WebMoveAttachment ( doc, "AttachedFile" )
4. Несколько Upload Control в одной форме. Как разложить загруженные файлы по соответствующим RT-полям? Проблема в том, что порядок имен загруженных файлов не сохраняется. Как определить - в каком File Upload какой аттачмент лежит?
Решение (by Natalia G. Kozlova):
У FileUpload Control можно задать идентификатор. Затем, на JS записываем название аттача в скрытое текстовое поле (каждому FileUpload Control соответствует свое поле), а дальше все просто.
Ограничение только одно - возникает путаница при вложении нескольких файлов с одинаковыми названиями, но здесь можно написать проверку на JS.
5. Как сделать ссылку на вложение (URL)?
Смотрим справку: APPLICATION DESIGN\Designing A Web Site\URL commands for opening attachments, image files, and OLE objects