利用DXL处理附件

本文介绍了如何使用Domino的DXL技术将Notes文档的附件转换为字节流,便于在不同系统间通过RESTful API进行数据交换。通过示例代码展示了将附件转换为XML文件并提取Base64编码的字符,然后解码显示或保存到磁盘的过程,强调了这种方法在实际应用中的价值。
摘要由CSDN通过智能技术生成

大家好,才是真的好。

DXL全称叫做Domino XML Language,是2002年Domino R6发布时推出的一项功能。可以将Notes和Domino应用程序中的文档数据和设计元素等以XML表示。

如果你对DXL较为感兴趣的话,可查看我们去年写的一篇《了不起的DXL!》。

今天我们谈谈利用DXL技术对附件进行处理操作。

一般如果是企业内部系统之间交换附件,则有办法,比如将附件拆到共享盘中,或者直接发送过去。

但如果是不同企业,或不同系统之间使用较为便捷的RESTFUL API进行数据交换,尤其是附件,则一般我们建议将附件转换为字节流,然后POST过去,对方收到以后再以字节流方式进行文件输出,例如在Java中可使用FileOutputStream将字节流还原为文件;LotusScript也可以使用stream类来进行操作。

在这个过程中,将Notes文档中的附件转换为字节流,传统的方式是使用LotusScript的NotesRichTextItem和NotesEmbeddedObject类方法(也可以使用Java中的类似方法),先下载附件,再使用LotusScript中的notesstream或Java中的stream类将文件处理为字节流。

其实我们可以更简单,直接采用Domino中的DXL将文档附件输出为XML文件,这其中附件将会自动转换为XML中的字节流。

我们举个例子来看,下列代码将用户选中的第一个Notes文档处理为DXL文件:

Sub Initialize
	Dim session As New NotesSession

	Dim db As NotesDatabase

	Dim coll  As NotesDocumentCollection

	Dim stream As NotesStream

	Dim DXLfilename$

	Dim BasePath$

	Dim doc As NotesDocument

	Dim exporter As NotesDXLExporter

	

	BasePath="c:\"

	Set db = session.Currentdatabase

	Set coll = db.UnprocessedDocuments

	If coll Is Nothing Then Exit Sub

	Set doc = coll.getfirstdocument

	If doc Is Nothing Then Exit Sub

	Set stream = session.CreateStream

	DXLfilename$ = BasePath$ & doc.universalid & ".dxl"

	Msgbox DXLfilename$

	If Not stream.Open(DXLfilename$) Then

		Messagebox "Cannot open " & DXLfilename$,, "Error"

		Exit Sub

	End If

	Set exporter = session.CreateDXLExporter

	Call exporter.SetInput(doc)

	Call exporter.SetOutput(stream)

	Call exporter.Process

End Sub

输出的DXL文件内容我们可以打开看看,里面包含一个附件,其数据结构应该如下图所示:
在这里插入图片描述
最重要的是我们上图所标注的Notes文档中的附件,即和标签之间的内容,以Base64进行编码的字符进行表示。

现在,我们可以利用如下代码将该字符提取出来,然后解码显示出来,你还记得前几篇我们的《Lotusscript中的Base64处理》吧?

Dim base64str As String
          Dim attachfilename As String
          Dim attachfilepath As String
          
	base64str = Strright(Strleft(stream.ReadText, "</filedata>"), "<filedata>")
	Msgbox DecodeBase64(base64str)

效果如下图:
在这里插入图片描述
也可以将该附件文件保存在磁盘某个位置,利用下列代码:

Set newdoc = db.CreateDocument
	Set doc = db.CreateDocument

	session.ConvertMime = False

	Call	newstream.WriteText(base64str,EOL_NONE)

	Set mime = newdoc.CreateMIMEEntity

	Call mime.SetContentFromText(newstream, "application/octet-stream", ENC_BASE64)

	Call mime.DecodeContent

	If Not(mime Is Nothing) Then

		pathname$ = "c:\temp\test.txt"

		If Not stream.Open(pathname$, "binary") Then

			Messagebox pathname$

			Exit Sub

		End If

		Call mime.GetContentAsBytes(stream)

		Call stream.Close

	End If


我们就能得到下载好的附件:
在这里插入图片描述
实际上你并没有必要这么来进行操作,直接存下来可能更简单,但本文的主要目的是能够将附件发送到第三方以进行数据交换,因此具备应用意义。

在实际过程中,你可能会碰到多个附件处理、中文字符乱码、配置的环境等各个方面因素影响,不过本篇就就基本的技术实现进行了讨论。

下一篇我们要等到五一之后和大家见面,祝大家五一愉快。

今天我们就讲到这里吧。

更多精彩文章,请关注微信公众号:协作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值