2017-06-30 109 views
3

我試圖通過ASP.NET按鈕單擊圖像發送Highcharts圖表。 我所試圖做的是:圖表從Base-64字符串轉換爲圖像時出現異常

轉換爲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 字符,多於兩個填充字符或非法字符 。 「}

然而,當我刪除?‘數據:圖像/ SVG + XML的;的base64’,然後將其轉換,它不會拋出異常,但圖像不會出現,應該怎麼辦

謝謝

+1

我在電子郵件方面的專家,但你不能只轉儲的base64內容直入電子郵件的地方,而不是去通過存儲流?關於你的問題 - 數據如何從客戶端到服務器,你可能會發現你不需要'HttpUtility.UrlDecode' - 框架可能會爲你處理它。 –

+0

我試圖把base64圖像作爲圖像源,但它沒有工作@JamesThorpe –

+1

你確定它是一個有效的base64字符串嗎? – KSib

回答

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); 
1

擺脫字符串的開始部分:「data:image/svg + xml; base64」,該部分不是base64,只剩下其餘的部分了。您不需要使用HttpUtility.UrlDecode

您應該指定TransferEncoding爲Base64:

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

然而,儘管如此,there are some strong caveats to using SVG in email。所以你可能想考慮一個不同的格式,如JPG或PNG。如果這是您採用的路線,則需要使用庫來轉換格式。

相關問題