簡體   English   中英

從Base-64字符串轉換為圖像時出現異常

[英]Exception when converting to image from Base-64 string

我試圖通過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'然后轉換它時,它不會拋出異常,但圖像不會出現。 我該怎么辦?

謝謝

擺脫字符串的開頭部分:“data:image / svg + xml; base64”,那部分不是base64,只是剩下的部分。 您也不需要使用HttpUtility.UrlDecode。

您應該將TransferEncoding指定為Base64:

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

然而,盡管如此, 在電子郵件中使用SVG還是有一些強烈的警告 因此,您可能需要考慮不同的格式,例如JPG或PNG。 如果這是您所采用的路線,則需要使用庫來轉換格式。

在經過多次研究后我找到了解決方案,主要問題是並非所有客戶端電子郵件都支持數據URI: 主要電子郵件客戶端軟件中的數據URI支持是什么?

我試圖打開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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM