Base64对xml.net中的大型文件进行编码/解码

Base64对xml.net中的大型文件进行编码/解码,.net,base64,decode,encode,.net,Base64,Decode,Encode,我有一个外部Web服务,它返回字节数组中的文件(大小为20Mb的文件),它必须转换为base64字符串并包含在XML文件中 编码 我用来将字节数组转换为base64的代码是 Convert.ToBase64String(bytearray, 0, bytearray.Length, _ Base64FormattingOptions.InsertLineBreaks) 下面是我使用Linq到xml的实际xml构造 attachment = From It

我有一个外部Web服务,它返回字节数组中的文件(大小为20Mb的文件),它必须转换为base64字符串并包含在XML文件中

编码

我用来将字节数组转换为base64的代码是

 Convert.ToBase64String(bytearray, 0, bytearray.Length, _
               Base64FormattingOptions.InsertLineBreaks)
下面是我使用Linq到xml的实际xml构造

    attachment = From Item In cpd _
      Select New XElement("attachment", _
          New XAttribute("id", Item.UniqueID), _
       New XElement("attachmentDocumentInformation", _
       New XElement("actor", New XAttribute("reference", Item.AttchRefId)), _
       New XElement("documentDescription", _
       New XElement("documentTitle", Item.Document), _
       New XElement("documentType", "A"), _
       New XElement("sequence", Item.Sequence))), _
       New XElement("documentContent", _
         New XAttribute("contentEncoding", "base64"), _
         New XAttribute("id", "DocumentContent" + Item.UniqueID), _
         New XAttribute("mimeType", Item.mimeType), _ 
                 Convert.ToBase64String(Item.Content, 0, Item.Content.Length, _ 
                 Base64FormattingOptions.InsertLineBreaks)))
解码

我对接收到的xml文件使用frombase64转换

 Convert.FromBase64String(documentContentinBase64)
当文件大小较小时,当文件转换返回“不支持此类接口”时,它可以正常工作

我有两个问题:

  • 将大文件转换为SE64/frombase64的最佳方法是什么
  • 将字节数组转换为base64后,构造包含base64文档的xml文件的最佳方法是什么。有人有密码吗

  • 谢谢

    这将大致跟随您的文档,简单地按摩一些名称,或添加xml序列化程序属性以获取您想要的xml文档:

    public class Document
    {
        public string Actor { get; set; }
        public string Description { get; set; }
        public string Title { get; set; }
        public string type { get { return "A"; } }
        public int Sequence { get; set; }
        public byte[] Content { get; set; }
    }
    
    
    var d = new Document() { Actor = "Sean Connory", Description = "Thriller", Title = "The Rock" };
    d.Content = new byte[] { 43,45,23,43,82,90,34 };
    
    var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Document));
    using (var ms = new System.IO.MemoryStream())
    {
        xmls.Serialize(ms, d);
        Console.Write(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
    }
    Console.ReadLine();
    
    XmlSerializer
    将自动将
    byte[]
    属性(在本例中为内容)转换为base64encoding和base64encoding。您正在寻找转换大型文件并将其放入xml文档的“最佳”方法。他们可能会用其他(更好的)方式这样做。但我过去用这种方法取得了很大的成功。如果设置正确,此解决方案可以为您节省很多麻烦,因为如果对象设置正确,它既可以为您构建xml文档,也可以将数据转换为Base64。另一方面,您可以获取一个xml文档并用它的所有数据填充一个对象,这样可以节省您导航xml节点以查找所需数据的时间

    更新


    如果这不能像预期的那样对大文件起作用,我确实找到了将流序列化为base64流的方法。我以前从未使用过此功能,因此无法为您提供任何类型的精彩见解,但它听起来更像是您正在寻找的内容。

    这大致遵循您的文档,简单地按摩一些名称,或添加xml序列化程序属性以获得所需的xml文档:

    public class Document
    {
        public string Actor { get; set; }
        public string Description { get; set; }
        public string Title { get; set; }
        public string type { get { return "A"; } }
        public int Sequence { get; set; }
        public byte[] Content { get; set; }
    }
    
    
    var d = new Document() { Actor = "Sean Connory", Description = "Thriller", Title = "The Rock" };
    d.Content = new byte[] { 43,45,23,43,82,90,34 };
    
    var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Document));
    using (var ms = new System.IO.MemoryStream())
    {
        xmls.Serialize(ms, d);
        Console.Write(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
    }
    Console.ReadLine();
    
    XmlSerializer
    将自动将
    byte[]
    属性(在本例中为内容)转换为base64encoding和base64encoding。您正在寻找转换大型文件并将其放入xml文档的“最佳”方法。他们可能会用其他(更好的)方式这样做。但我过去用这种方法取得了很大的成功。如果设置正确,此解决方案可以为您节省很多麻烦,因为如果对象设置正确,它既可以为您构建xml文档,也可以将数据转换为Base64。另一方面,您可以获取一个xml文档并用它的所有数据填充一个对象,这样可以节省您导航xml节点以查找所需数据的时间

    更新


    如果这不能像预期的那样对大文件起作用,我确实找到了将流序列化为base64流的方法。我以前从未使用过此功能,因此无法为您提供任何类型的精彩见解,但它听起来更像您正在寻找的东西。

    Convert.FromBase64String
    没有这样的签名。你能确认一下你的密码吗?当你说“爆炸”时,你是什么意思;有例外吗?如果是这样,发布异常的内容。同时假设此时bContent只是
    documentContent
    节点的值?为什么不序列化一个对象,让
    XmlSerializer
    为您完成所有工作?是的,编码中的b内容是bytearray,解码中的b内容是base64string。包含文档是xml文件中的一小部分,此xml包中包含更多属性和xml文档,我不确定是否使用xmlserializer,我将对此进行研究。将20Mb文件序列化为xml文档中的base64编码字符串听起来是一种糟糕的做法。。。您确定不能只包含一个链接,该链接可用于以二进制格式在辅助进程中检索文件本身吗?
    Convert.FromBase64String
    没有这样的签名。你能确认一下你的密码吗?当你说“爆炸”时,你是什么意思;有例外吗?如果是这样,发布异常的内容。同时假设此时bContent只是
    documentContent
    节点的值?为什么不序列化一个对象,让
    XmlSerializer
    为您完成所有工作?是的,编码中的b内容是bytearray,解码中的b内容是base64string。包含文档是xml文件中的一小部分,此xml包中包含更多属性和xml文档,我不确定是否使用xmlserializer,我将对此进行研究。将20Mb文件序列化为xml文档中的base64编码字符串听起来是一种糟糕的做法。。。您确定不能只包含一个链接,该链接可用于在二进制格式的辅助进程中检索文件本身吗?只是想检查一下,这不是一个关于如何使用Base64的建议,而是一种序列化文件的替代方法,它应该更健壮吗?你可能想提供更多的解释,因为我的第一个想法是“向下投票,因为它似乎与base64编码没有任何关系”。是的,我的观点是,你可能更想解释这就是你在答案本身中所做的。就其本身而言,您所建议的内容并不明显。使用XMLSerializer,我能够成功地处理小文件的内容,但无法成功处理大文件的内容。我尝试了
    Debug.Write(System.Text.Encoding.UTF8.GetString(ms.ToArray())
    ,并在调试输出窗口上看到它,它在某个点构建Base64字符串时停止了,我没有得到任何错误,输出窗口没有显示content元素,但有其他元素和值。我在这里遗漏了一些东西?只是想检查一下,这不是一个关于如何使用Base64的建议,而是一种序列化文件的替代方法,应该更健壮吗?你可能想