Lotusscript сохраняет base64 кодированную строку в файл (DLL) - PullRequest
0 голосов
/ 15 октября 2019

[РЕДАКТИРОВАТЬ] Я полагаю, я не учел мою первоначальную проблему. Мне кажется, что проблема заключается в передаче содержимого декодированного MIMEEntity в поток, который я хотел бы записать в файл. Независимо от того, как я это делаю, я не могу заставить скрипт лотоса записать двоичные данные в файл. Если у кого-либо есть полезное мнение / предложение / и т.д .., я был бы более чем благодарен!

[ОРИГИНАЛ] У меня есть следующий код

Dim a As String
a = "TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" & _
"AAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v" & _
...
...

Dim session As New NotesSession
Dim stream As NotesStream
Dim doc As NotesDocument
Dim body As NotesMimeEntity
Dim db As NotesDatabase
Set session = New NotesSession

 'Create stream and display properties
Set stream = session.CreateStream

 'check if the file exists
If Not stream.Open("C:\\Notes\\update.dll") Then
     'if the file doesnot exist then create one and add a time stamp to it
    Dim fileNum As Integer
    fileNum% = Freefile()
    Open "/ww414/notes/ebcdicfile.txt" For Output As fileNum%
    Close fileNum%
     'this should have created the file. see if it existis now
    If Not stream.Open("C:\\Notes\\update.dll") Then
   'if the file has not been created yet then let the user know of the error that blocks the operation
        Messagebox("Log file Is inaccessible")
    End If
End If

Dim b As NotesStream
Set b = session.CreateStream

Call b.WriteText(a)
'==========================================================


'update file with the b64 decoded content
Set db = session.CurrentDatabase
Set doc = db.CreateDocument
session.ConvertMime = False

Set body = doc.CreateMIMEEntity
Call body.SetContentFromText(b, "", ENC_BASE64)
Call body.DecodeContent
content = body.ContentAsText
Call stream.WriteText(content)

'close stream/file open in memory
Call stream.Close()

Проблема в том, что файлсоздается, но когда дело доходит до контента, он просто помещает в него несколько байтов (вместо 14 КБ фактических данных файла)

Я проверил несколько форумов и возможных решений, но ни один из нихпохоже на работу. Например: https://www.nsftools.com/tips/Base64v14.lss

http://www -10.lotus.com / ldd / nd6forum.nsf / e5f5333619f2996885256a220009508f / a8bb2c21c99f9c4d852571ee005cede9? OpenDocument *

1 Ответ

0 голосов
/ 16 октября 2019

Итак, решение было еще проще, как я думал.

Это было огромной помощью, поскольку коренной причиной моей проблемы, казалось, было выписывание двоичного содержимого вдиск. И это было связано с неправильным созданием файла! Несмотря на то, что файл был создан, он не мог правильно выводить содержимое (по некоторым «причинам Lotus» ...)

В любом случае, перерыв на кофе и запуск всего с нуля очень помогли! Код, который работал (для будущей ссылки, если кому-то понадобится заставить такую ​​вещь работать):

Sub Initialize

Dim a As String
a ="BASE64 ENCODED STRING(In my case it was a DLL)" 

Dim session As New NotesSession
Dim stream As NotesStream
Dim doc As NotesDocument
Dim body As NotesMimeEntity
Dim db As NotesDatabase
Set session = New NotesSession

Set stream = session.CreateStream

Dim b As NotesStream
Set b = session.CreateStream

Call b.WriteText(a, EOL_NONE)

Set db = session.CurrentDatabase
Set doc = db.CreateDocument
session.ConvertMime = False

Set mime = doc.CreateMIMEEntity
Call mime.SetContentFromText(b, "application/octet-stream", ENC_BASE64)
Call mime.DecodeContent

If Not(mime Is Nothing) Then
    Set stream = session.CreateStream
    pathname$ = "c:\temp\test.dll"
    If Not stream.Open(pathname$, "binary") Then
        Messagebox pathname$,, "Open failed"
        Goto ExitSub
    End If
    Call mime.GetContentAsBytes(stream)
    Call stream.Close
Else
    Messagebox "Not MIME",, doc.GetItemValue("Subject")(0)
End If  
ExitSub:
    session.ConvertMIME = True ' Restore conversion
End Sub
...