2011-06-09 178 views
1

我有它返回字節數組的文件外部web服務(小,大20MB的文件的),它必須被轉換成BASE64的字符串和包括在XML文件的Base64編碼/解碼的大文件

編碼

代碼我用轉換的字節數組的base64是

Convert.ToBase64String(bytearray, 0, bytearray.Length, _ 
       Base64FormattingOptions.InsertLineBreaks) 

下面是實際的XML結構我使用LINQ到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))) 

解碼

我用frombase64轉換爲接收到的XML文件

Convert.FromBase64String(documentContentinBase64) 

時文件的體積更小尺寸它工作得很好,當它是一個大的文件轉換返回「無這種接口支持「。

我有兩個問題:

  1. 什麼是大文件轉換tobase64/frombase64的最佳方式?
  2. 在將字節數組轉換爲base64之後,構建帶有base64文檔的xml文件的最佳方式是什麼?有沒有人有一些代碼?

感謝

+0

'Convert.FromBase64String'沒有這樣的簽名。你能確認你的代碼嗎? – Jay 2011-06-09 16:31:13

+1

當你說「爆炸」時,你的意思是什麼;有沒有例外?如果是這樣,請發佈例外的內容。 – Jacob 2011-06-09 16:32:10

+0

另外假設在這一點上,bContent是'documentContent'節點的值嗎?爲什麼不序列化一個對象並讓'XmlSerializer'爲你做所有的工作? – Jay 2011-06-09 16:34:31

回答

1

這大致如下文檔,簡單的按摩一些名字,或添加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(); 

XmlSerializerbyte[]屬性轉換(在這種情況下內容)自動進出base64encoding。您正在尋找將大文件轉換爲xml文件的「最佳」方法。他們是我的其他(更好的)方式。但我過去曾以這種方式取得了巨大的成功。如果安裝正確,該解決方案可以爲您節省很多麻煩,因爲它將爲您構建xml文檔,並在數據正確設置時將數據轉換爲Base64。反過來,你可以獲取一個XML文檔,並使用它的所有數據填充一個對象,這樣可以節省導航xml節點的時間以查找所需的數據。

更新

如果這不適合大文件按預期方式工作,我做了序列化流爲Base64流找到this MSDN article。我以前從未與之合作過,因此無法爲你提供任何有用的信息,但這聽起來更像你正在尋找的東西。

+1

只是爲了檢查這個建議不是關於如何使用Base64,而是序列化文件的另一種方式,應該更強大?你可能想提供一些更多的解釋,因爲我的第一個想法是「downvote,因爲它似乎沒有與base64編碼有關」。 – Chris 2011-06-09 16:58:28

+0

是的,我的觀點更多的是你可能想解釋這就是你在回答中所做的。就其本身而言,你所暗示的究竟是什麼並不明顯。 – Chris 2011-06-10 08:31:54

+0

使用XMLSerializer我能夠成功處理小文件的大文件,但我不成功。我試過'Debug.Write(System.Text.Encoding.UTF8.GetString(ms.ToArray()))'並且在它正在構建base64string的調試輸出窗口看到它停止了,我沒有得到任何錯誤並且輸出窗口不顯示內容元素,但具有其他元素和值。我在這裏錯過了什麼? – zeusmos 2011-06-10 21:39:21