Sample code for 30+ languages & platforms
PureBasic

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