从Base64String转换失败与Kendo图表相关

6

我在页面上绘制了Kendo图表,并将它们的图像数据发布到一个操作以保存这些Base64编码数据到(SQL Server)数据库。

以下是exportImage调用,其中我首先从dataURL中拆分出Base64数据:

chart.exportImage({
    width: 727,
    height: 262
}).done(function(data) {
    // split 'image/png,xxxyyy=' into two
    var dataParts = data.split(',', 2);
    // TODO: need to strip from 'data:image/png;base64'
    dataParts[0] = 'image/png';

    $.ajax({
        url: "@Url.Action("
        Export_TargetPrice ", "
        Charts ")",
        type: 'POST',
        data: {
            contentType: dataParts[0],
            base64: dataParts[1],
            companyID: companyId
        }
    }).done(function() {

    });

});

我的Export_TargetPrice方法本质上只是调用Convert.FromBase64String,然后写入数据库:

/// <summary>
/// Export TargetPrice chart image for company (without download).
/// </summary>
[HttpPost]
public ActionResult Export_TargetPrice(string contentType, string base64, int companyID) {
    var fileContents = Convert.FromBase64String(base64);

    ChartTargetPriceImage chartImage = new ChartTargetPriceImage {
        CompanyID = companyID,
            Data = fileContents,
            Extension = contentType,
            CreateDate = DateTime.Now
    };
    db.ChartTargetPriceImage.Add(chartImage);

    db.SaveChanges();

    return new HttpStatusCodeResult(HttpStatusCode.OK); // 200
}

我正在使用base64decode.org和freeformatter.com尝试解码从数据库获取的base64编码数据。然而,它常常失败,没有明显的原因或模式。对于一个公司来说可能失败,但是如果我明天再试就可能成功了。

之前我生成了10个图表(页面上有50个图表,我可以生成需要的任何一个),其中一半失败了。它们是相同的图表,相同的设计,来自部分数据,只有数据不同。

在浏览器中,我可以复制接收到的base64变量/数据,并通过freeformatter.com成功地创建图表,但数据库中的数据可能会失败。

为什么这个过程会失败?(为什么它只有一些时候会失败?)


我还尝试了以下操作,但并没有起作用:检查FormatException(如果数据不是4的倍数),然后通过填充等号来使其成为4的倍数。

byte[] fileContents;

// check if multiple of 4
int overFour = base64.Replace(" ", "").Length % 4;
if (overFour > 0) {
    // add trailing padding '='
    base64 += new string('=', 4 - overFour);
}

try {
    fileContents = Convert.FromBase64String(base64);
} catch (FormatException ex) {
    return new HttpStatusCodeResult(HttpStatusCode.ExpectationFailed, base64.Length.ToString());
}

我还检查过接收到的base64数据不包含任何意外字符。


2
希望在这里看到失败和成功的base64字符串示例。 - jekcom
我无法直接提供它们,因为超出了字符限制,所以pastebin可以使用pastebin失败了。我意识到数据是二进制编码的,而且可能不是测试的理想工具。 - Andy G
2
我很难看出它不起作用的地方。我能够将你的两个示例解码为工作图像。请查看以下结果链接:result link - jekcom
看起来我可能浪费了时间和悬赏,因为解码工具是误导性的(尤其是在与二进制数据一起使用时),问题可能是最终用于显示图像的翻译过程。感谢@jekcom的评论。 - Andy G
1个回答

0

显然,在这种情况下,使用像base64decode.org这样的工具是不合适的,代码正在运行,问题在于从数据中检索和创建图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接