Sample code for 30+ languages & platforms
SQL Server

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 SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

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

    DECLARE @mime int
    EXEC @hr = sp_OACreate 'Chilkat.Mime', @mime OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    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
    -- 

    EXEC sp_OAMethod @mime, 'LoadMimeFile', @success OUT, 'qa_data/mime/headless_binary_soap_mtom_mime.mim'
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @mime, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @mime
        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.
    DECLARE @numParts int
    EXEC sp_OAGetProperty @mime, 'NumParts', @numParts OUT

    -- The 1st part at index 0 is the application/xop+xml.  We're just going to extract the JPG and GIF image files..
    DECLARE @sbFilename int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbFilename OUT

    DECLARE @name nvarchar(4000)

    DECLARE @i int
    SELECT @i = 1
    DECLARE @mp int
    EXEC @hr = sp_OACreate 'Chilkat.Mime', @mp OUT

    WHILE @i < @numParts
      BEGIN

        EXEC sp_OAMethod @mime, 'PartAt', @success OUT, @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..
        EXEC sp_OAMethod @sbFilename, 'Append', @success OUT, 'qa_output/'
        EXEC sp_OAMethod @mp, 'GetHeaderFieldAttribute', @name OUT, 'Content-Disposition', 'name'
        EXEC sp_OAMethod @sbFilename, 'Append', @success OUT, @name
        EXEC sp_OAMethod @sbFilename, 'Append', @success OUT, '.'
        EXEC sp_OAGetProperty @mp, 'ContentType', @sTmp0 OUT
        EXEC sp_OAMethod @sbFilename, 'Append', @success OUT, @sTmp0
        DECLARE @numReplaced int
        EXEC sp_OAMethod @sbFilename, 'Replace', @numReplaced OUT, 'image/', ''
        EXEC sp_OAMethod @sbFilename, 'GetAsString', @sTmp0 OUT
        EXEC sp_OAMethod @mp, 'SaveBody', @success OUT, @sTmp0

        EXEC sp_OAMethod @sbFilename, 'GetAsString', @sTmp0 OUT
        PRINT 'output file: ' + @sTmp0
        EXEC sp_OAMethod @sbFilename, 'Clear', NULL
        SELECT @i = @i + 1
      END


    PRINT 'Success.'

    EXEC @hr = sp_OADestroy @mime
    EXEC @hr = sp_OADestroy @sbFilename
    EXEC @hr = sp_OADestroy @mp


END
GO