【问题标题】:Mule ESB : java component serving zip file but unable to unzipMule ESB:提供 zip 文件但无法解压缩的 java 组件
【发布时间】:2016-10-02 03:10:09
【问题描述】:

Flow 获取 http 请求,java 组件创建一个 zip 文件并发送回。 zip 文件已下载,但当我解压缩时,我收到错误消息,提示“压缩文件夹无效”。 java 在临时位置创建的临时 zip 工作正常。问题是如何将 zip 文件设置为有效负载?

public Object onCall(MuleEventContext eventContext) throws Exception {
    MuleMessage message = eventContext.getMessage();

    message.setOutboundProperty("Content-type", "application/zip");
    message.setOutboundProperty("Content-Disposition", "attachment;filename=\"my_Logs.zip\"");
    File tempZip = File.createTempFile("LOGS", ".zip");
    FileOutputStream fos = new FileOutputStream(tempZip);
    ZipOutputStream zipOut = new ZipOutputStream(fos);

    File logDir = new File("C:/Temp/logs");
    zipOut.setMethod(ZipOutputStream.DEFLATED);
    zipOut.setLevel(9);
    FileInputStream in =null;
    int len =0;
    byte[] buf = new byte[1024];
    for(File file : logDir.listFiles()){
        String filename = file.getName();
        in = new FileInputStream(file);
        zipOut.putNextEntry(new ZipEntry(filename));
        while ((len = in.read(buf))>0){
            zipOut.write(buf,0,len);
        }
        zipOut.closeEntry();
        in.close();
    }
    zipOut.close();
    message.setPayload(tempZip);
    return message;
}

流程

<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<flow name="httppayloadFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="*" doc:name="HTTP"/>
    <message-filter doc:name="Filter favicon">
        <not-filter>
            <wildcard-filter pattern="/favicon.ico" caseSensitive="true"/>
        </not-filter>
    </message-filter>
    <component class="com.home.zipper.ZipLogs" doc:name="Java"/>
</flow>

我在这里做错了什么?感谢任何帮助

【问题讨论】:

    标签: java http mule esb payload


    【解决方案1】:

    你可以试试这个完美的压缩和服务文件。

    Mule Zip File and send zipped file towards FTP server

    改变一下

    在 ZipTransformer 构造函数中,不推荐使用以下内容。

    registerSourceType(InputStream.class);
    registerSourceType(byte[].class);
    

    改用这个:

    registerSourceType(DataTypeFactory.create(InputStream.class));
    registerSourceType(DataTypeFactory.create(byte[].class));
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我替换了以下代码 message.setPayload(tempZip); 和 message.setPayload(org.apache.commons.io.FileUtils.readFileToByteArray(tempZip));

      【讨论】: