GZip 解压缩组件问题
GZip uncompress component issue
我正在研究 mule flow,运行 遇到困难
要求:
从 Payload 获取 ZIP 文件
解压得到文件名列表
拉回
FTP一样
我 运行 遇到了 2 个问题
- 获取原始文件名 - 我尝试了不同的组合,例如#[message.inboundProperties.originalFileName],但得到的是空值。
- 解压缩文件
下面是我的流程(我没有将 FTP 和 ZIP 流程作为 运行 包含在 FTP 之前的问题中)
我对您描述的要求、使用 GZip 压缩以及您的流程截图感到有点困惑。
您的要求表明您将要加载 Zip 存档(文件),这与 GZip 流非常不同 - GZip 连接器在这里无法帮助您。 GZip 只是简单地压缩一个字节流,它内部没有多个 files/folders 的概念——这就是为什么在 *nix 世界中它通常与 Tar 结合使用(即 Tar 连接将许多文件组合成一个未压缩的存档,然后对该存档进行 GZip 压缩)。 Zip 本质上结合了这两者 - 存档和压缩。
此外,您的屏幕截图显示了一个 HTTP 入站端点 - 因此我假设该文件已发布给您。 #[message.inboundProperties.originalFileName]
仅由文件入站端点设置,这就是您看不到它的原因。您也没有提及您将使用哪种内容类型。我见过的最常见的用例是 multipart/form-data
- 如果您正在使用它,那么您可以通过 Mule 的 inboundAttachments
映射访问该文件及其名称。
如果我对您所做的事情的理解是正确的,下面是我将如何实施它的示例(为简洁起见删除了错误 checking/handling):
来源:
<flow name="sampleFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/zip" allowedMethods="POST" doc:name="HTTP"/>
<foreach collection="#[message.inboundAttachments]" doc:name="For Each Attachment (There could be more than 1)">
<scripting:component doc:name="Groovy - examine attachment and set vars">
<scripting:script engine="Groovy"><![CDATA[import java.io.*;
import java.util.zip.*;
// should be application/zip - could valudate
flowVars.type = payload.dataSource.contentType;
// datasource will be HttpPartDataSource
flowVars.partName = payload.dataSource.part.name;
flowVars.filename = payload.dataSource.part.fileName;
flowVars.filesInZip = new java.util.ArrayList();
payload = payload.dataSource.content;
ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(payload));
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null)
flowVars.filesInZip.add(ze.name);
zis.close();
return payload;
]]></scripting:script>
</scripting:component>
<ftp:outbound-endpoint host="localhost" port="21" path="/dest" passive="true" outputPattern="#[flowVars.filename]" responseTimeout="10000" doc:name="FTP"/>
<dw:transform-message doc:name="Transform Message">
<dw:set-session-variable variableName="results"><![CDATA[%dw 1.0
%output application/java
---
(sessionVars.results default []) ++ [{
partName: flowVars.partName,
fileName: flowVars.filename,
filesInZip: flowVars.filesInZip joinBy ', '
}]
]]></dw:set-session-variable>
</dw:transform-message>
</foreach>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
sessionVars.results
]]></dw:set-payload>
</dw:transform-message>
</flow>
邮递员示例调用:
输出:
[
{
"partName": "zip2",
"fileName": "OC.zip",
"filesInZip": "OC/staging/, OC/staging/b2b-test/, OC/staging/Madrid/, OC/staging/Madrid/B1805259-1527220273.txt, OC/staging/Madrid/B1805259-1527221226.txt, OC/staging/Madrid/B1805259-1527226248.txt, OC/staging/Madrid/B1805259-1527226249.txt, OC/staging/Madrid/B1805259-1527226475.txt, OC/staging/Madrid/B1805259-1527226476.txt, OC/staging/Madrid/B1805299-1527544507.txt, OC/staging/Madrid/B1805299-1527545678.txt, OC/staging/Madrid/B1805299-1527545679.txt, OC/staging/Madrid/B1805299-1527548307.txt, OC/staging/Madrid/B1805299-1527550180.txt, OC/staging/Madrid/B1805299-1527553547.txt, OC/staging/Madrid/B1805299-1527553548.txt"
},
{
"partName": "zip1",
"fileName": "FirstZipFile.zip",
"filesInZip": "LogitechWebcamFix.log, BGChanger.log"
}
]
我正在研究 mule flow,运行 遇到困难
要求:
从 Payload 获取 ZIP 文件
解压得到文件名列表
拉回
FTP一样
我 运行 遇到了 2 个问题
- 获取原始文件名 - 我尝试了不同的组合,例如#[message.inboundProperties.originalFileName],但得到的是空值。
- 解压缩文件
下面是我的流程(我没有将 FTP 和 ZIP 流程作为 运行 包含在 FTP 之前的问题中)
我对您描述的要求、使用 GZip 压缩以及您的流程截图感到有点困惑。
您的要求表明您将要加载 Zip 存档(文件),这与 GZip 流非常不同 - GZip 连接器在这里无法帮助您。 GZip 只是简单地压缩一个字节流,它内部没有多个 files/folders 的概念——这就是为什么在 *nix 世界中它通常与 Tar 结合使用(即 Tar 连接将许多文件组合成一个未压缩的存档,然后对该存档进行 GZip 压缩)。 Zip 本质上结合了这两者 - 存档和压缩。
此外,您的屏幕截图显示了一个 HTTP 入站端点 - 因此我假设该文件已发布给您。 #[message.inboundProperties.originalFileName]
仅由文件入站端点设置,这就是您看不到它的原因。您也没有提及您将使用哪种内容类型。我见过的最常见的用例是 multipart/form-data
- 如果您正在使用它,那么您可以通过 Mule 的 inboundAttachments
映射访问该文件及其名称。
如果我对您所做的事情的理解是正确的,下面是我将如何实施它的示例(为简洁起见删除了错误 checking/handling):
来源:
<flow name="sampleFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/zip" allowedMethods="POST" doc:name="HTTP"/>
<foreach collection="#[message.inboundAttachments]" doc:name="For Each Attachment (There could be more than 1)">
<scripting:component doc:name="Groovy - examine attachment and set vars">
<scripting:script engine="Groovy"><![CDATA[import java.io.*;
import java.util.zip.*;
// should be application/zip - could valudate
flowVars.type = payload.dataSource.contentType;
// datasource will be HttpPartDataSource
flowVars.partName = payload.dataSource.part.name;
flowVars.filename = payload.dataSource.part.fileName;
flowVars.filesInZip = new java.util.ArrayList();
payload = payload.dataSource.content;
ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(payload));
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null)
flowVars.filesInZip.add(ze.name);
zis.close();
return payload;
]]></scripting:script>
</scripting:component>
<ftp:outbound-endpoint host="localhost" port="21" path="/dest" passive="true" outputPattern="#[flowVars.filename]" responseTimeout="10000" doc:name="FTP"/>
<dw:transform-message doc:name="Transform Message">
<dw:set-session-variable variableName="results"><![CDATA[%dw 1.0
%output application/java
---
(sessionVars.results default []) ++ [{
partName: flowVars.partName,
fileName: flowVars.filename,
filesInZip: flowVars.filesInZip joinBy ', '
}]
]]></dw:set-session-variable>
</dw:transform-message>
</foreach>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
sessionVars.results
]]></dw:set-payload>
</dw:transform-message>
</flow>
邮递员示例调用:
输出:
[
{
"partName": "zip2",
"fileName": "OC.zip",
"filesInZip": "OC/staging/, OC/staging/b2b-test/, OC/staging/Madrid/, OC/staging/Madrid/B1805259-1527220273.txt, OC/staging/Madrid/B1805259-1527221226.txt, OC/staging/Madrid/B1805259-1527226248.txt, OC/staging/Madrid/B1805259-1527226249.txt, OC/staging/Madrid/B1805259-1527226475.txt, OC/staging/Madrid/B1805259-1527226476.txt, OC/staging/Madrid/B1805299-1527544507.txt, OC/staging/Madrid/B1805299-1527545678.txt, OC/staging/Madrid/B1805299-1527545679.txt, OC/staging/Madrid/B1805299-1527548307.txt, OC/staging/Madrid/B1805299-1527550180.txt, OC/staging/Madrid/B1805299-1527553547.txt, OC/staging/Madrid/B1805299-1527553548.txt"
},
{
"partName": "zip1",
"fileName": "FirstZipFile.zip",
"filesInZip": "LogitechWebcamFix.log, BGChanger.log"
}
]