文章
· 十月 20, 2022 阅读大约需 5 分钟

在集成产品中压缩解压文件

在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
}

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
}
讨论 (0)1
登录或注册以继续