Замечание к документу "может это поможет? (+)"   >>>   
Тема: Раз уж на то пошло, выкладываю сюда. File upload control by HTML

Создан:Александр Чудилин; Grot 09/16/2003 08:15 AM
Модифицирован:Александр Чудилин 09/16/2003 11:21 AM
Папка:
07. Разработка Web-приложений
Тип сообщения:
Решение

Сообщение:

Сие должно было опубликоваться на 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).

Например:
<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>

Теперь эту подформу можно вставлять в любую форму. Web-пользователь увидит поля для ввода имени файла. При нажатии на кнопку Submit создастся документ по форме AttachmentForm и указанный пользователем файл присоединится к этому документу.

Задача решена.

Обсуждалось здесь http://www.intertrust.ru/site/itforum.nsf/49341ed5f4f44f64c3256cee002eeae7/de29f8a679c3c319c4256d6e0047aaa1!OpenDocument

Что дальше?

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

1. Вложения, полученные из интернет, не привязываются к конкретному полю и висят внизу документа. Как их скрыть?
Создайте служебное скрытое поле $V2AttachmentOptions со строковым значением "0".
Источник: http://www.intertrust.ru/site/itforum.nsf/49341ed5f4f44f64c3256cee002eeae7/097d92041aee643843256982002a0c64!OpenDocument

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" )

    '--Save the document
    Call doc.Save ( True, True )

End Sub

Источник: http://www.intertrust.ru/site/itforum.nsf/49341ed5f4f44f64c3256cee002eeae7/d63bf067a7bbbf1943256982002a39ca!OpenDocument

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

У FileUpload Control можно задать идентификатор. Затем, на JS записываем название аттача в скрытое текстовое поле (каждому FileUpload Control соответствует свое поле), а дальше все просто.

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


Источник: http://www.intertrust.ru/Site/itforum.nsf/all/93AF4140C1D3D241C3256BE2002511C5?OpenDocument

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

А именно: http://www.server.ru/path/db.nsf/view/docname/$File/AttachmentFileName

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

Все самое интересное было найдено в форуме Интертраст (http://www.intertrust.ru/Site/itforum.nsf/) поиском по слову "upload".

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




Иерархия документов данной дискуссии:
Господа помогите кто чем может !!!!!!!!!!! (Pasha S Kletsko) (15.09.2003 17:40:26)
.... может это поможет? (+) (Andrey V Firsov) (15.09.2003 18:56:58)
........ Раз уж на то пошло, выкладываю сюда. File upload control by HTML (Александр Чудилин; Grot) (16.09.2003 8:15:37)
............ Информацию получил , спасибочьки . Буду разбираться . (Pasha S Kletsko) (16.09.2003 15:17:36)
............ Хм. Тестовую базу зааттачить не удалось. Это так задумано или у меня глюки? (Александр Чудилин; Grot) (16.09.2003 8:17:49)
.... А чем не катит в Дизайнере Create -> Embedded Element -> File Upload Control (-) (Evgeny V. Polyakov; InterTrust) (15.09.2003 17:59:35)


Разработчикам и администраторам: курсы, книги, сертификация