Sample code for 30+ languages & platforms
PureBasic Requires Chilkat v11.0.0+

Extract Files from Binary SOAP MTOM MIME

See more MIME Examples

This example demonstrates how to extract files from a binary SOAP MTOM MIME document.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkMime.pb"

Procedure ChilkatExample()

    success.i = 0

    ;  This example requires the Chilkat API to have been previously unlocked.
    ;  See Global Unlock Sample for sample code.

    mime.i = CkMime::ckCreate()
    If mime.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ;  In this example, we have a MIME file containing 8bit (non-encoded) binary data,
    ;  and it is what I call "headless".  MIME is headless when it omits
    ;  the top-level header.  The file we have here begins with the first
    ;  boundary string.

    ;  The structure the MIME to be loaded is:

    ;  multipart/mixed (inferred because it is headless)
    ;      application/xop+xml
    ;      image/jpeg
    ;      image/gif
    ;      image/gif
    ;  

    success = CkMime::ckLoadMimeFile(mime,"qa_data/mime/headless_binary_soap_mtom_mime.mim")
    If success = 0
        Debug CkMime::ckLastErrorText(mime)
        CkMime::ckDispose(mime)
        ProcedureReturn
    EndIf

    ;  The MIME file loaded in this example contains this:

    ;  --uuid:e74486f4-52b0-44b6-b829-156810fae20d
    ;  Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml"
    ;  Content-Transfer-Encoding: binary
    ;  Content-ID: <root.message@cxf.apache.org>
    ;  
    ;  <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Body> ... </soap:Body></soap:Envelope>
    ;  --uuid:e74486f4-52b0-44b6-b829-156810fae20d
    ;  Content-Type: image/jpeg
    ;  Content-Transfer-Encoding: binary
    ;  Content-ID: <beee83b7-166c-494c-890a-def990e9887b-1496@cxf.apache.org>
    ;  Content-Disposition: attachment;name="-2049913191"
    ;  
    ;  BINARY DATA HERE...
    ;  
    ;  --uuid:e74486f4-52b0-44b6-b829-156810fae20d
    ;  Content-Type: image/gif
    ;  Content-Transfer-Encoding: binary
    ;  Content-ID: <beee83b7-166c-494c-890a-def990e9887b-1497@cxf.apache.org>
    ;  Content-Disposition: attachment;name="-2049913188"
    ;  
    ;  BINARY DATA HERE...
    ;  
    ;  --uuid:e74486f4-52b0-44b6-b829-156810fae20d
    ;  Content-Type: image/gif
    ;  Content-Transfer-Encoding: binary
    ;  Content-ID: <beee83b7-166c-494c-890a-def990e9887b-1498@cxf.apache.org>
    ;  Content-Disposition: attachment;name="-2049913185"
    ;  
    ;  BINARY DATA HERE...
    ;  
    ;  --uuid:e74486f4-52b0-44b6-b829-156810fae20d--

    ;  Get the number of MIME sub-parts.
    numParts.i = CkMime::ckNumParts(mime)

    ;  The 1st part at index 0 is the application/xop+xml.  We're just going to extract the JPG and GIF image files..
    sbFilename.i = CkStringBuilder::ckCreate()
    If sbFilename.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    name.s
    i.i = 1
    mp.i = CkMime::ckCreate()
    If mp.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    While i < numParts

        CkMime::ckPartAt(mime,i,mp)

        ;  By looking at the MIME above, the "name" attribute of the Content-Disposition header field seems
        ;  to be the only possible name we can use for each image..
        CkStringBuilder::ckAppend(sbFilename,"qa_output/")
        name = CkMime::ckGetHeaderFieldAttribute(mp,"Content-Disposition","name")
        CkStringBuilder::ckAppend(sbFilename,name)
        CkStringBuilder::ckAppend(sbFilename,".")
        CkStringBuilder::ckAppend(sbFilename,CkMime::ckContentType(mp))
        numReplaced.i = CkStringBuilder::ckReplace(sbFilename,"image/","")
        CkMime::ckSaveBody(mp,CkStringBuilder::ckGetAsString(sbFilename))
        Debug "output file: " + CkStringBuilder::ckGetAsString(sbFilename)
        CkStringBuilder::ckClear(sbFilename)
        i = i + 1
    Wend

    Debug "Success."


    CkMime::ckDispose(mime)
    CkStringBuilder::ckDispose(sbFilename)
    CkMime::ckDispose(mp)


    ProcedureReturn
EndProcedure