我正在尝试将 Fabric.Canvas 的 toDataURL 返回的“数据”中包含的 Base-64 数据转换为具有相应扩展名(BMP)的文件。结果是“文件格式不正确”错误。
我遵循的步骤如下。
我使用 toDataURL 方法从 Fabric.Canvas 获取 dataURL 变量。
dataURL = canvas.toDataURL({ 格式:'bmp', 质量:1.0 });
我仅提取包含“数据”的字符串。
dataURLto64 = dataURL.substr(dataURL.lastIndexOf(',') + 1, dataURL.length - dataURL.lastIndexOf(',') - 1);
以上是在客户端完成的。在服务器上,我需要将字符串分段保存在 TXT 文本文件中。我已经验证文本文件的最终内容与原始 dataURLto64 (以 Base-64 表示)相同。
我提取文本文件的内容。
string strtextfile64 = File.ReadAllText([path]);
我使用 Convert.FromBase64String 方法将该字符串转换为字节数组
byte[] fileBinary = null;
fileBinary = Convert.FromBase64String(strtextfile64);
File.WriteAllBytes([path], fileBinary);
我已经验证 dataURLto64 和 strtextfile64 具有相同的字符和相同的数字。 为了验证 Base-64 字符串是否正确,我在服务器上添加了以下验证。
int mod4 = strtextfile64.Length % 4;
if (mod4 > 0) {
strtextfile64 += new string('=', 4 - mod4);
}
无需修改 strtextfile64,因为 mod4 = 0。
我附加了两个文本文件,其中包含初始(客户端)和最终(服务器)Base-64 字符串。
有人可以告诉我为什么 Base-64 数据转换为二进制数据不符合从 Fabric.Canvas 创建的原始 BMP 文件中的原始 BMP 格式吗?
我认为问题在于您的 base64 字符串可能使用不同的方法进行编码,而 Convert.FromBase64String 无法正确解码。
先尝试标准化base64:
string normalizedInput = input.Replace('-', '+').Replace('_', '/');
while (normalizedInput.Length % 4 != 0)
{
normalizedInput += "=";
}
byte[] data = Convert.FromBase64String(normalizedInput);