代码之家  ›  专栏  ›  技术社区  ›  Andy G

fromBase64string无法使用kendo图表

  •  6
  • Andy G  · 技术社区  · 6 年前

    我在一个页面上绘制了剑道图表,并将它们的图像数据发布到一个操作中,以便将这个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
    }
    

    我正在使用base64 decode.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 回复  |  直到 6 年前
        1
  •  0
  •   Andy G    6 年前

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