从Base-64字符串转换为图像时出现异常

时间:2017-06-30 12:54:14

标签: javascript c# asp.net highcharts base64

我正在尝试通过ASP.NET按钮单击上的图像发送Highcharts图表。 我想做的是:

将图表转换为base64图像,代码如下:

  var chart = $('#main-content').highcharts();
    EXPORT_WIDTH = 1000;
    var render_width = EXPORT_WIDTH;
    var render_height = render_width * chart.chartHeight / chart.chartWidth;

    var svg = chart.getSVG({
        exporting: {
            sourceWidth: chart.chartWidth,
            sourceHeight: chart.chartHeight
        }
    });
    var contentToSend = 'data:image/svg+xml;base64,' + window.btoa(svg);
    var hdnField = document.getElementById("MainContent_ChartImage");
    hdnField.value = contentToSend;

下一步是获取base64图像值,将其转换为图像并将其附加到邮件中,代码为:

 string textImage = ChartImage.Value;

 var imageData = Convert.FromBase64String(HttpUtility.UrlDecode(data));
 System.Net.Mail.LinkedResource res;
 AlternateView htmlView;
 using (MemoryStream ms = new MemoryStream(imageData, true))
 {
      ms.Position = 0;
      ms.Write(imageData, 0, imageData.Length);
      ms.Seek(0, SeekOrigin.Begin);
      res = new System.Net.Mail.LinkedResource(ms);
      htmlView = AlternateView.CreateAlternateViewFromString("<html><body><img src='cid:imageReport' width='100%' ></body></html>", null, "text/html");
      res.ContentId = "imageReport";
      htmlView.LinkedResources.Add(res);
      MailMessage mailMsg = new MailMessage();
      SmtpClient client = new SmtpClient();

      // ...

      mailMsg.IsBodyHtml = true;
      mailMsg.AlternateViews.Add(htmlView);
      client.Send(mailMsg);
 }

但方法Convert.FromBase64String会抛出异常

  

{“输入不是有效的Base-64字符串,因为它包含非基数64   字符,两个以上的填充字符或非法字符   填充字符之间。 “}

然而,当我删除'data:image / svg + xml; base64',然后转换它,它不会抛出异常,但图像不会出现。我该怎么办?

谢谢

2 个答案:

答案 0 :(得分:1)

摆脱字符串的开头部分:&#34; data:image / svg + xml; base64,&#34;那部分不是base64,只剩下部分了。您也不需要使用HttpUtility.UrlDecode。

您应将TransferEncoding指定为Base64:

res.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;

然而,尽管如此,there are some strong caveats to using SVG in email。因此,您可能需要考虑不同的格式,例如JPG或PNG。如果这是您所采用的路线,则需要使用库来转换格式。

答案 1 :(得分:0)

经过多次研究后我找到了解决方案,主要问题是并非所有客户端电子邮件都支持数据URI: What is Data URI support like in major email client software?

我试图打开Outlook 2016的邮件,但不支持,当我从hotmail.com打开它工作..

代码是:

MailMessage mailMsg = new MailMessage();
SmtpClient client = new SmtpClient();
var imageData = Convert.FromBase64String(data);
var contentId = Guid.NewGuid().ToString();
var linkedResource = new LinkedResource(new MemoryStream(imageData), "image/svg+xml");
linkedResource.ContentId = contentId;
linkedResource.TransferEncoding = TransferEncoding.Base64;
var body = string.Format("<img src=\"cid:{0}\" />", contentId);
var htmlView = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
 htmlView.LinkedResources.Add(linkedResource);
 mailMsg.AlternateViews.Add(htmlView);