2016-10-09 34 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); 

曾经为我工作过。

相关问题