我正在处理一些代码,以便从Dynamics CRM电子邮件附件读出BODY字段,并将Base64字符串解码回文件以写入文件系统。
这个过程似乎可以在.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);
我已经尝试将二进制数据存储在一个文件中并将其读入,并且只是使用内容定义一个C#字符串。正如我所说,它适用于其他文件类型,但不是PDF。
但解决方案只是循环遍历一个字节数组并单独写入每个字节,它仍然以一个在Acrobat中无法打开的损坏的PDF文件结束。
最终,我将从数据库字段或通过CRM API读取binaryData,但我只是想先测试一下这个理论,除了PDF之外,我似乎对所有附件类型都很好......
答案 0 :(得分: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);
让我们看看这是否解决了这个问题。
答案 1 :(得分:0)
我学到的是,SQL表中BODY字段中的值只能容纳32kb的blob流..我不知道它的重置位置。我四处询问,并且每个人都表示“不支持从SQL获取”,即使从CRM SQL过滤视图中读取数据也是支持的......
因此,当我使用小型PNG和JPG文件进行测试时,它很好,但是如果我尝试使用更大的文件它将无法正常工作,当所有最大的流都保存到文件系统时都是32kb时,我点击了。
最后我通过CRM SDK而不是SQL中的FilteredEmailAttachment视图中的SQL获取附件流数据来解决它
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);
}
答案 2 :(得分:0)
由于它是验证逻辑引起的错误,您可以检查base64数据中是否有空格,如果有的话,请用' +'替换它们。使用我正在讨论的解决方案复制问题场景。
var binaryData = File.ReadAllText(@"E:\test\stream.txt");
byte[] byteArray = Convert.FromBase64String(binaryData.Replace(' ', '+'));
File.WriteAllBytes(@"E:\test\file.pdf", byteArray);
过去曾为我工作过。