FromBase64String не работает с графиками кендо - PullRequest
0 голосов
/ 05 июля 2018

У меня нарисованы графики Kendo на странице, и я отправляю их данные изображений в действие, чтобы сохранить эти закодированные в 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 не содержат неожиданных символов.

1 Ответ

0 голосов
/ 17 июля 2018

Очевидно, что использование таких инструментов, как base64decode.org, не подходит в этом случае, и что код работает, и проблема заключается в конечном извлечении и создании изображений из данных.

...