在InterSystems IRIS医疗版里有一个文件压缩解压的适配器HS.Util.Zip.Adapter和对应的文件压缩解压业务操作HS.Util.Zip.Operations。集成产品可以使用它们进行文件的压缩和解压操作。这2个类的联机文档说明较少,这里介绍它们的使用方法。
1. 基础配置
InterSystems IRIS使用操作系统的压缩和解压缩能力,因此需要注册操作系统执行压缩解压的命令。
在管理门户的Health标签页下,选中配置注册(Configuration Registry):
在其中增加2个注册项目:
\ZipUtility\UnZipCommand 和\ZipUtility\ZipCommand,分别代表解压和压缩命令。适配器HS.Util.Zip.Adapter会检查这2个注册项并得到相应的命令。各个操作系统的命令并不一样,示例如下:
\ZipUtility\UnZipCommand 解压缩命令
Windows | "c:\program files\7-zip\7z" x %1 -o. -r |
非Windows | unzip %1 -d . |
\ZipUtility\ZipCommand 压缩命令
Windows | "c:\program files\7-zip\7z" a %1 . -r |
非Windows | zip -rm %1 . |
注意,其中要有%1,代表解压后的或压缩后的目标文件路径。
2. 适配器配置
可以直接使用业务操作HS.Util.Zip.Operations,无需自己开发业务操作类。这个系统提供的业务操作使用的就是适配器HS.Util.Zip.Adapter。
将业务操作HS.Util.Zip.Operations加入Production,配置其工作目录(WorkingDirectory),就是上面提到压缩/解压命令中%1代表的目录。注意,这个目录并非HS.Util.Zip.Operations输出的目标路径,它只是压缩/解压过程中用到的临时目录。这个业务操作执行压缩/解压后,会自动删除临时目录中的文件,而将目标文件流数据保存到响应消息里。
3. 调用压缩/解压业务操作
这个业务操作的请求消息是HS.Message.ZipRequest,响应消息是HS.Message.ZipResponse。
3.1 请求消息准备
HS.Message.ZipRequest里有如下属性:
Operation:执行的操作,压缩或解压缩。可用值为"FromZip" - 解压缩,和"ToZip" 压缩。
File:解压文件的Stream数据,类型为%Stream.GlobalBinary。在执行文件解压时才需要设置该属性 - 需要将解压文件的Stream赋值给File属性。
Items: 文件项目列表,列表元素类型为HS.Types.ZipItem。在执行文件压缩时才需要设置该属性 - 需要将多个压缩文件的数据赋值给Items列表元素的以下属性:
Filename:未来解压缩出来的目标文件名
Path:未来解压缩出来的目标文件子目录
File:需要压缩的文件流数据
3.2 处理响应消息
HS.Message.ZipResponse有如下属性:
File:在执行文件压缩操作时,该属性保存压缩后的流数据。在执行解压操作时,该属性为空。
Items:文件项目列表,列表元素类型为HS.Types.ZipItem。在执行文件解压操作时,该列表属性的元素保护以下属性:
Filename:解压缩出来的目标文件名
Path:解压缩出来的目标文件子目录
File:解压缩出来的流数据
4. 示例代码
以下是直接调用HS.Util.Zip.Operations的业务服务代码示例。
4.1 压缩示例
Method OnProcessInput(pInput As %RegisteredObject, Output pOutput As %RegisteredObject) As %Status
{
//实例化请求消息
Set tReq = ##class(HS.Message.ZipRequest).%New()
//设置源文件目录
Set tSrcFolder = "/Users/test/irishealth/mgr/Temp/"
//设置请求消息为压缩操作
Set tReq.Operation = "ToZip"
Set tFile = ##class(%Stream.FileBinary).%New()
Set sc=tFile.LinkToFile(tTgtFolder_"output.zip")
Set tReq.File = tFile
//压缩的第一个文件
Set tItem1 = ##class(HS.Types.ZipItem).%New()
//设置未来解压缩的文件名
Set tItem1.Filename = "test.png"
//设置未来解压缩的子文件夹
Set tItem1.Path = "pic/"
//打开目标文件,获取流数据
Set tFileSrc = ##class(%Stream.FileBinary).%New()
Do tFileSrc.LinkToFile(tSrcFolder_tItem1.Filename)
Do tItem1.File.CopyFrom(tFileSrc)
kill tFileSrc
//将压缩文件信息插入列表
Do tReq.Items.Insert(tItem1)
//压缩的第二个文件
Set tItem2 = ##class(HS.Types.ZipItem).%New()
//设置未来解压缩的文件名
Set tItem2.Filename = "HS.SDA3.xsd"
//设置未来解压缩的子文件夹
Set tItem2.Path = "code/"
//打开目标文件,获取流数据
Set tFileSrc = ##class(%Stream.FileBinary).%New()
Do tFileSrc.LinkToFile(tSrcFolder_tItem2.Filename)
Do tItem2.File.CopyFrom(tFileSrc)
kill tFileSrc
//将压缩文件信息插入列表
Do tReq.Items.Insert(tItem2)
//调用业务操作
Do ..SendRequestSync("HS.Util.Zip.Operations",tReq,.tRes)
//设置目标路径
Set tFolder = "/Users/test/irishealth/mgr/Temp/Target/"
//保存压缩文件到目标路径
Set tTgtFile = ##class(%Stream.FileBinary).%New()
Set tFullPath = tFolder_"output.zip"
Set tTgtFile.Filename = tFullPath
Set tSC = tTgtFile.CopyFrom(tRes.File)
Set tSC= tTgtFile.%Save()
Quit $$$OK
}
ObjectScriptObjectScript
4.2 解压缩示例
Method OnProcessInput(pInput As %RegisteredObject, Output pOutput As %RegisteredObject) As %Status
{
//实例化请求消息
Set tReq = ##class(HS.Message.ZipRequest).%New()
//设置请求消息为解压缩操作
Set tReq.Operation = "FromZip"
//打开压缩文件,获取流数据
Set tFileSrc = ##class(%Stream.FileBinary).%New()
Set sc=tFileSrc.LinkToFile("/Users/test/Downloads/TestCase.zip")
//Set tReq.File = tFileSrc
Do tReq.File.CopyFrom(tFileSrc)
kill tFileSrc
//调用业务操作
Do ..SendRequestSync("HS.Util.Zip.Operations",tReq,.tRes)
//设置目标文件路径
Set tTgtFolder = "/Users/test/irishealth/mgr/Temp/"
//获取解压后的数据,并保存到目标文件路径下
For i=1:1:tRes.Items.Count()
{
Set tFileItem = tRes.Items.GetAt(i)
Set tSubFolder = tFileItem.Path
Set tFileName = tFileItem.Filename
Set tTgtFile = ##class(%Stream.FileBinary).%New()
Set tFullPath = tTgtFolder_tSubFolder_tFileName
Set tTgtFile.Filename = tFullPath
Set tSC = tTgtFile.CopyFrom(tFileItem.File)
Set tSC= tTgtFile.%Save()
Kill tTgtFile
}
Quit $$$OK
}
ObjectScriptObjectScript