GZip распаковка компонента - PullRequest
0 голосов
/ 25 мая 2018

Я работаю над потоком мулов и сталкиваюсь с трудностями

Требование:

  1. Получить ZIP-файл из полезной нагрузки

  2. Распакуйте его и получите список имен файлов

  3. Zip it back

  4. FTP такой же

У меня 2 проблемы

  1. Получить исходное имя файла - я пробовал разные комбинации, например # [message.inboundProperties.originalFileName], но получаю нулевое значение.
  2. Распаковать файл

Ниже приведен мой поток (я не включил поток FTP и ZIP в связи с проблемами до FTP) enter image description here

1 Ответ

0 голосов
/ 29 мая 2018

Меня немного смущают ваши требования, как описано, использование сжатия GZip и скриншот вашего потока.

Ваше требование предполагает, что вы собираетесь загружать Zip-архив (файл), который сильно отличается от потока GZip - разъем GZip вам здесь не поможет.GZip просто сжимает поток байтов, в нем нет концепции нескольких файлов / папок - вот почему в мире * nix он обычно объединяется с Tar (т.е. Tar объединяет множество файлов в один несжатый архив иэтот архив тогда GZip'd).Zip по сути объединяет в себе и то, и другое - архивирование и сжатие.

Кроме того, на вашем снимке экрана показана конечная точка входящего HTTP - поэтому я предполагаю, что файл отправляется вам.#[message.inboundProperties.originalFileName] устанавливается только конечной точкой входящего файла, поэтому вы ее не увидите.Вы также не упоминаете, с каким типом контента вы будете работать.Самым распространенным случаем использования, который я видел, является multipart/form-data - и если вы используете его, вы можете получить доступ к файлу и его имени с помощью карты inboundAttachments Mule.

Если я понимаю, что вы 'Это правильно, ниже приведен пример того, как я бы это реализовал (проверка / обработка ошибок удалена для краткости):

Sample flow

Источник:

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

Пример звонка почтальона:

Postman Sample

Выход:

[
    {
        "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"
    }
]
...