Sample code for 30+ languages & platforms
DataFlex

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

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoMime
    Integer iNumParts
    Handle hoSbFilename
    String sName
    Integer i
    Variant vMp
    Handle hoMp
    Integer iNumReplaced
    String sTemp1

    Move False To iSuccess

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

    Get Create (RefClass(cComChilkatMime)) To hoMime
    If (Not(IsComObjectCreated(hoMime))) Begin
        Send CreateComObject of hoMime
    End

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

    Get ComLoadMimeFile Of hoMime "qa_data/mime/headless_binary_soap_mtom_mime.mim" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoMime To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // 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.
    Get ComNumParts Of hoMime To iNumParts

    // The 1st part at index 0 is the application/xop+xml.  We're just going to extract the JPG and GIF image files..
    Get Create (RefClass(cComChilkatStringBuilder)) To hoSbFilename
    If (Not(IsComObjectCreated(hoSbFilename))) Begin
        Send CreateComObject of hoSbFilename
    End

    Move 1 To i
    Get Create (RefClass(cComChilkatMime)) To hoMp
    If (Not(IsComObjectCreated(hoMp))) Begin
        Send CreateComObject of hoMp
    End
    While (i < iNumParts)

        Get pvComObject of hoMp to vMp
        Get ComPartAt Of hoMime i vMp To iSuccess

        // 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..
        Get ComAppend Of hoSbFilename "qa_output/" To iSuccess
        Get ComGetHeaderFieldAttribute Of hoMp "Content-Disposition" "name" To sName
        Get ComAppend Of hoSbFilename sName To iSuccess
        Get ComAppend Of hoSbFilename "." To iSuccess
        Get ComContentType Of hoMp To sTemp1
        Get ComAppend Of hoSbFilename sTemp1 To iSuccess
        Get ComReplace Of hoSbFilename "image/" "" To iNumReplaced
        Get ComGetAsString Of hoSbFilename To sTemp1
        Get ComSaveBody Of hoMp sTemp1 To iSuccess
        Get ComGetAsString Of hoSbFilename To sTemp1
        Showln "output file: " sTemp1
        Send ComClear To hoSbFilename
        Move (i + 1) To i
    Loop

    Showln "Success."


End_Procedure