2016-10-09 33 views
1

我正在研究一些代碼,以便從Dynamics CRM電子郵件附件中讀出BODY字段並將Base64字符串解碼爲要寫入的文件到文件系統。來自Dynamics CRM的PDF blob數據的Base-64字符數組或字符串的無效長度

這個過程似乎像。PNG等時,Excel的.xls等圖像文件做工精細,但當我試着和PDF文件轉換爲C#中的字節數組我得到的錯誤:

無效的長度Convert.FromBase64String()行上的Base-64字符數組或字符串。

var binaryData = File.ReadAllText(@"E:\test\stream.txt"); 
byte[] byteArray = Convert.FromBase64String(binaryData); 
File.WriteAllBytes(@"E:\test\file.pdf", byteArray); 

我試過將binarydata存儲在一個文件中並讀取它,以及只是定義一個帶有內容的C#字符串。正如我所說,它適用於其他文件類型,但不是PDF。

我發現了另一個參照同樣的問題, https://social.microsoft.com/Forums/en-US/7a28e106-3715-42b9-a743-9e5207a02540/problem-while-decoding-the-body-field-of-activitymimeattachment-entity?forum=crm

但溶液通過字節數組只是循環和單獨寫每個字節,它仍然在一個腐敗的PDF文件,結束了和Acrobat慣於開放。

最終,我會從數據庫字段或通過CRM API讀取binaryData,但我只是想先測試理論,我似乎是對所有類型的附件,除了PDF好...

+0

一篇文章,我看到說,嘗試填充二進制數據之前,轉換爲一個字節數組..我嘗試了類似於下面,我得到過去的轉換錯誤,但PDF仍然損壞:字符串dummyData = b.Trim() .Replace(「」,「+」);如果(dummyData.Length%4> 0)dummyData = dummyData,則爲 。PadRight(dummyData.Length + 4 - dummyData.Length%4,'='); byte [] byteArray = Convert.FromBase64String(dummyData); –

+0

處理字節和處理文本在編程中是完全不同的任務。當您將文本轉換爲字節(反之亦然)時,程序將根據關於編碼,字節順序和本地化的假設來格式化字節,這裏舉幾個例子。除非絕對需要將文件轉換爲文本,否則應從開始到結束將文件視爲字節數組。 – Abion47

回答

0

這只是我的猜測,我不知道這是否有效。

有時候字符編碼是錯誤的,因爲文本文件可能有一個BOM(Byte Order Mark),只是任意的二進制數據會干擾它。您可以通過讀取數據爲二進制byte[],然後將其轉換成ASCII如下所示強制編碼爲ASCII:

byte[] data; 

data = File.ReadAllBytes(@"E:\test\stream.txt"); 
string base64 = System.Text.Encoding.ASCII.GetString(data); 
data = Convert.FromBase64String(base64); 
File.WriteAllBytes(@"E:\test\file.pdf", data); 

讓我們看看是否能解決什麼。

+0

謝謝,我嘗試了ASCII編碼的東西..最後我的原始流是壞的文件大於32kb ..因爲它正在處理小文件,我錯誤地認爲我的方法是正確的..但它不是..謝謝回覆。 –

0

我學到的是SQL表中的BODY字段中的值只能包含32kb的blob流..我不知道它的重置位置在哪裏。我問周圍,每一個人說'從SQL獲取不支持的方式'...即使從CRM SQL過濾視圖是支持讀取數據...

因此,當我測試小PNG和JPG文件時,它很好,但如果我嘗試一個更大的文件它不會工作,我點擊時,所有最大的流都保存到文件系統都是32kb。

到底

我解決它通過獲取SQL通過CRM SDK,而不是從SQL在FilteredEmailAttachment查看附件流數據

var attachments = (from a in cc.CRMContext.ActivityMimeAttachments where a.ActivityId == email.ActivityId select a).ToList(); 
       foreach (var attachment in attachments) 
       { 
        byte[] byteArray = Convert.FromBase64String(attachment.Body); 
        System.IO.File.WriteAllBytes(@"E:\test\temp\" + attachment.FileName, byteArray); 
       } 
0

因爲它是從驗證邏輯產生的,也許你可以一個錯誤檢查base64數據中是否有空白,如果有,請用'+'替換它們。用我正在談論的解決方案複製問題場景。

var binaryData = File.ReadAllText(@"E:\test\stream.txt"); 
byte[] byteArray = Convert.FromBase64String(binaryData.Replace(' ', '+')); 
File.WriteAllBytes(@"E:\test\file.pdf", byteArray); 

曾經爲我工作過。

相關問題