У меня нарисованы графики 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 не содержат неожиданных символов.