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