FromBase64String与Kendo图表一起失败

时间:2018-07-05 14:32:17

标签: c# asp.net-mvc telerik kendo-chart

我在页面上绘制了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来查看是否可以从数据库数据中成功解码base64(也可以使用freeformatter.com)。它通常会失败,但是没有明显的原因或模式。对于一家公司来说,它是失败的,但是如果我明天尝试,它可能会起作用。

之前,我生成了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数据是否包含任何意外字符。

1 个答案:

答案 0 :(得分:0)

很明显,在这种情况下,不适合使用诸如base64decode.org之类的工具,并且代码可以正常工作,并且问题在于最终从数据中检索和创建图像。