Втянуть файл через Web-сервис в базу. Можно ли?

susinmn

Well-Known Member
16.10.2007
529
8
#1
Можно ли через Web-сервис втянуть файл, ну и прикрепить его к документу?
Подскажите в какую сторону копнуть
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#2
Запрос и ответ — это xml. Нужно разработать соответствующий интерфейс. В запросе указывать путь и имя файла или другую идентифицирующую информацию, в ответ "упаковывать" файл в xml в соответствующей кодировке, на приёме "распаковывать". Ключевые слова для поиска в справке Lotus: wsdl, dxl, NotesDOMParser, NotesDXLExporter, NotesDXLImporter, NotesSAXParser, NotesXSLTransformer, NotesXMLProcessor. Ну и тут на форуме примеры мелькали.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 223
24
#3
susinmn
а вы смогли для начала просто втянуть какую нить страничку?
если смогли то в чем проблема втянуть файл?
 

Gor

Well-Known Member
07.06.2005
517
2
#5
есть по этой ссылке такой раздел...
Скачал базу, решил посмотреть что к чему.

Есть там такой ЛОтусовый вебсервис BookDownloadUpload, который якобы должен создавать новый документ и крепить к нему аттачмент.
Всё через SOAP Toolkit 3.0

Попробовал его заюзать с помощью опять же уже написанного агента в этой базе, который обращается к этому веб сервису (MSSOAP BookDownloadUpload Test).

в вызове вебсервиса обращаюсь к функции addNewFile из сервиса BookDownloadUpload и передаю туда 5 параметров, последний из которых
бинарный stream

Код:
Sub Initialize
Dim wsdl As String
Dim client As Variant
Dim result As Variant
Dim result2 As Variant


Dim startTime As Single
Dim endTime As Single

'** create the MSSOAP object, based on our WSDL file
startTime = Timer
wsdl = "http://test.server/WSBookstore.nsf/BookDownloadUpload?WSDL"

'** try to use MSSOAP 3.0, if available
On Error Resume Next
Set client = CreateObject("MSSOAP.SoapClient30")
On Error Goto processError

'** if not, use whatever version is on the workstation
If (Err > 0) Then
Err = 0
Set client = CreateObject("MSSOAP.SoapClient")
End If
Call client.MSSoapInit(wsdl)

'** call the GetFirstTitleMatch method (note that MSSOAP is
'** NOT case-sensitive with the method names)
Set result = client.getFirstTitleMatch("T")
endTime = Timer
Print "Total elapsed time: " & Fix((endTime - startTime) * 1000) & " milliseconds"

'================================
Dim session As New NotesSession
Dim fileIN As NotesStream
Set fileIN = session.CreateStream 


If Not fileIN.Open("c:\teete.txt","Binary") Then
Msgbox "Cannot open teete.txt", , "Error"	
Exit Sub 
End If 
If fileIN.Bytes = 0 Then 
Msgbox "File did not exist or was empty", , "teete.txt" 
Exit Sub 
End If

Set result2 = client.addNewFile("test","Test","description one sdfasf", "Reference", "teete.txt",fileIN) 
'==========================================з

На этой строчке

Set result2 = client.addNewFile("test","Test","description one sdfasf", "Reference", "teete.txt",fileIN)

сваливается в ошибку о несоответствии типов... Хотя вроде бы написано что данный параметр может принимать либо бинарный либо ASCII поток...

в функции addNewFile такая:

Код:
Public Function addNewFile (title As String, author As String, description As String, _
typeOfBook As BookType, fileName As String, base64file As XSD_BASE64BINARY, _
returnFault As WS_FAULT) As String
Dim book As New BookInfoAndFile
book.title = title
book.author = author
Set book.typeOfBook = typeOfBook
book.description = description
book.fileName = fileName
Set book.base64file = base64file
addNewFile = addNewFileComplex(book, returnFault)
End Function

т.е. переменная типа base64file As XSD_BASE64BINARY

что же в неё тогда передавать если не поток?? и что это за тип такой?
Кто нибудь копал дальше?)))
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#6
Gor
В справке дизайнера см. разделы "Java and LotusScript mappings", "Web services Java and LotusScript classes"
 

Gor

Well-Known Member
07.06.2005
517
2
#7
почитал...

The following LotusScript XSD classes are proxy classes: XSD_BASE64BINARY, XSD_DATE, XSD_DATETIME, XSD_HEXBINARY, and XSD_TIME. Like the other XSD classes, they have a public variable named "Value" that you can get and set. However, the "Value" variable is not of type String.

The information for the classes XSD_BASE64BINARY and XSD_HEXBINARY is passed in NotesStream format.

Но всё равно непонятно, почему вызываемая функция
Set result2 = client.addNewFile("test","Test","description one sdfasf", "Reference", "teete.txt",fileIN)

Код:
Public Function addNewFile (title As String, author As String, description As String, _
typeOfBook As BookType, fileName As String, base64file As XSD_BASE64BINARY, _
returnFault As WS_FAULT) As String
Dim book As New BookInfoAndFile
book.title = title
book.author = author
Set book.typeOfBook = typeOfBook
book.description = description
book.fileName = fileName
Set book.base64file = base64file
addNewFile = addNewFileComplex(book, returnFault)
End Function
возвращает несоответствие форматов.
"SOAP Fault: Client:Type conversion failure for element BASE64FILE Detail: Client:Type conversion failure for element BASE64FILE HRESULT=0x80020005: Type mismatch.
На вход же подаётся формат notesstream...

Или же пора мне с этим заканчивать и идти домой)))
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#8
Gor
Читаем внимательно :blush::
XSD_BASE64BINARY
The proxy class mapped to XML Schema type base64Binary. Nillable.
Super class:
XSD_SIMPLETYPE
methods:
SUB setValueFromNotesStream (nsValue As NotesStream)
Sets the XML representation by converting bytes in the NoteStream to a base64-encoded string.
FUNCTION getValueAsNotesStream () As NotesStream
Converts the current base64-encoded XML representation to bytes in the returned NotesStream.
Inherited methods:
SUB setValueFromString (value As String)
Sets the current value from a string of base64-encoded characters
FUNCTION getValueAsString () As String
Returns the current value of base64-encoded characters.