FromBase64String 使用剑道图表失败

Posted

技术标签:

【中文标题】FromBase64String 使用剑道图表失败【英文标题】:FromBase64String fails with Kendo charts 【发布时间】:2018-12-14 02:12:28 【问题描述】:

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

这是exportImage 调用,我首先将base64 数据从dataURL 中拆分出来:

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 数据不包含任何意外字符。

【问题讨论】:

很高兴在这里看到失败的例子和工作的 base64 字符串 我无法直接提供它们,因为超出了字符数限制,所以pastebin works、pastebin fails。我意识到数据是二进制编码的,可能 base64decode.org 不是一个理想的测试工具。 我很难看出它在哪里不起作用。我能够将您的两个示例都解码为工作图像。查看下面的结果result link 看起来我可能一直在浪费我的时间和我的赏金,因为解码工具具有误导性(特别是在与二进制数据一起使用时)并且可能是最终翻译的问题用于显示图像的过程。感谢 @jekcom 的 cmets。 【参考方案1】:

很明显,在这种情况下不适合使用 base64decode.org 等工具,而且代码正在运行,问题在于最终从数据中检索和创建图像。

【讨论】:

以上是关于FromBase64String 使用剑道图表失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在工具提示模板中使用剑道图表数据?

剑道图表分组系列排序问题

如何更改剑道图表的背景图像?

如何在剑道图表中应用纯色效果

剑道图表导出为 pdf 或 png

如何使用 MVC 的服务器端包装器设置剑道图表的高度?