C# 使用SSIS从XML中提取base64编码的图像
我有一个复杂的场景,客户发送C# 使用SSIS从XML中提取base64编码的图像,c#,xml,ssis,xsd,C#,Xml,Ssis,Xsd,我有一个复杂的场景,客户发送XML文件,我应该从这些文件中提取一些信息。一个重要的信息是在base64中编码的图像 xml的xsd文件定义了包含base64编码图像的元素,如下所示: <xs:element name="image" type="xs:base64Binary" nillable="false" minOccurs="0" maxOccurs="unbounded"&g
XML
文件,我应该从这些文件中提取一些信息。一个重要的信息是在base64
中编码的图像
xml
的xsd
文件定义了包含base64编码图像的元素,如下所示:
<xs:element name="image" type="xs:base64Binary" nillable="false" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation xml:lang="en">
base64 image.
</xs:documentation>
</xs:annotation>
</xs:element>
该脚本一直执行到调用FromStream
方法,并失败,出现以下错误:
参数无效
Q2:考虑到上述场景和配置,如何修复代码错误并成功保存映像?A1。
根据定义,编码二进制是ASCII字符串数据,因此数据的初始提取将是DT_STRmaybe
在这一点上,您可以直观地检查XML中的字符以确认是的,我正确地从XML中提取了该字段
下一步是将base64编码反转或转换为原始二进制位
A2.Image.FromStream错误
我不确定Image
类的来源,但它可能试图将数据转换为不同的图像格式(png到jpg到bmp等),但内存中的位已经是您需要的位了。您只需要将字节数组写入磁盘,类似于
可能
联机丛书上的数据类型链接指出了数据类型的最大长度,我们看到DT_STR是8000个字符,而DT_IMAGE/DT_BYTES/DT_TEXT是2.1M个单位(字符或字节)。因为这些数据都不是unicode数据,所以存储成本是相同的,但是没有一种表达式语言可以对数据进行操作(null和长度检查IIRC除外),data viewer将被集中在其中,因此目视检查可能具有挑战性
jpg是一种压缩文件格式——它们丢弃数据以减少字节数。但是Base64是反压缩的,因为它将危险的二进制字符映射为安全的ascii字符,从而增大了大小。所以,除非你知道你的源图像非常小,否则你很可能会溢出8000个字符的边界
假设通货膨胀率为1.3,您将看到大致5970字节的最大原始大小。6kb的jpg文件可能很小,而且质量很低。例如,此图像为5151字节
最后的想法
由于我已经输入了这些内容并考虑了问题域,除非您有充分的理由使用数据流,否则在本例中我将避免使用它。相反,使用脚本任务分解XML。如果您不必担心将数据类型拟合到SSIS基元类型中,也不必担心您的所有操作都将是.NET脚本操作,那么我想问题会少一些。我的问题没有得到解决,但我最终采用了您建议的方法,通过一个脚本任务处理
XML
,该任务有效:)
byte[] imageBytes = Base64DecodeString(bmpAsString);
fstrm = new FileStream(@"C:\winnt_copy.bmp", FileMode.CreateNew, FileAccess.Write);
BinaryWriter writer = new BinaryWriter(fstrm);
writer.Write(imageBytes);
writer.Close( );
fstrm.Close( );