来自Dynamics CRM的PDF blob数据上的Base-64字符数组或字符串的长度无效

本文关键字:数组 字符串 字符 无效 CRM Dynamics PDF blob 来自 数据 Base-64 | 更新日期: 2023-09-27 18:12:11

我正在编写一些代码,从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);

我已经尝试将binarydata存储在一个文件中并读取它,以及只是定义一个c#字符串的内容。正如我所说,它可以在其他文件类型上工作,但不是PDF。

我发现另一个参考同样的问题,https://social.microsoft.com/forums/en us/7a28e106 - 3715 - 42 - b9 - a743 - 9 - e5207a02540/problem -同时解码的身体-场- activitymimeattachment entity?forum=crm

但是解决方案只是循环遍历字节数组并单独写入每个字节,它仍然以在Acrobat中无法打开的损坏的PDF文件告终。

最终,我将从数据库字段或通过CRM API读取binaryData,但我只是想先测试理论,我似乎对所有附件类型都很好,除了PDF…

来自Dynamics CRM的PDF blob数据上的Base-64字符数组或字符串的长度无效

这只是我的猜测,我不知道这是否有效。

有时字符编码是错误的,因为文本文件可能有一个BOM(字节顺序标记),只是任意的二进制数据可以干扰它。您可以通过将数据读取为二进制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);

让我们看看这是否解决了问题

我学到的是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);
                }

由于这是由验证逻辑引起的错误,也许您可以检查base64数据中是否有空白,如果有,则将其替换为'+'。用我正在谈论的解决方案复制问题场景。

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

过去为我工作过