{{announcement.body}}
{{announcement.title}}

Multiple Attachments in MuleSoft

DZone 's Guide to

Multiple Attachments in MuleSoft

In this post, a Mule-based developer shows us how we can handle attachments in MuleSoft, using the example of sending attachments to REST/SOAP API.

· Integration Zone ·
Free Resource

This article is all about how we can handle multiple attachments in MuleSoft.

Let's say we have a requirement to send attachments to a REST/SOAP API.

In order to achieve this one can follow the below steps:

1. Declare a variable which can store a list.    

<set-variable variableName="attachments" value="#[new.java.util.ArrayList()]" doc:name="attachments">

2. Use a foreach scope in order to handle multiple attachments and read attachments using the transform-message component. Add each attachment to the array list. 

<foreach collection="#[message.inboundAttachments]" doc:name="For Each">
<dw:transform-message doc:name="Read Attachment">
<dw:set-payload><![CDATA[
          %dw 1.0
          %output application/java
          ---
          {
          "fileName": payload.dataSource.part.fileName,
          "filedata": payload.inputStream,
          "fileSize": payload.dataSource.part.size
          }
        ]]></dw:set-payload>
    </dw:transform-message>
<expression-transformer expression="#[flowVars.attachments.add(payload)]" doc:name="Add attachment to List">
</foreach>

If you want to send an encoded string instead of a byte array, you can define a global function and use it as below:

<configuration doc:name="Configuration">
<expression-language>
<global-functions>
def byteToEncodedString(bytes) {
import org.apche.commons.codec.binary.Base64;
import java.lang.String;
byte[] encoded = Base64.encodeBase64(bytes);
String encoString = new String(encoded);
return encodedString;
}
</global-functions>
</expression-language>
</configuration>

Use the above global function in DataWeave:

          %dw 1.0
          %output application/java
          ---
          {
          "fileName": payload.dataSource.part.fileName,
          "filedata": byteToEncodedString(payload.inputStream),
          "fileSize": payload.dataSource.part.size
          }

Set payload with value = flowVars.attachments.

Now if you have any specific request format for an API, you can easily transform the current payload in the required format using a Transform Message component.

Topics:
mulesoft ,integration ,rest api ,soap api

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}