繁体   English   中英

从MVC Controller Action渲染数据库映像

[英]Render database image from MVC Controller Action

我有一个邮寄活动,它会生成HTML电子邮件,这些电子邮件会定期发送给客户。

最近,我更改了系统,以允许最终用户配置邮件快照中某些图像元素的配置,而不是静态配置。 这些图像使用GUID ID存储在数据库中,并通过Controller Action加载,如下所示:

[HttpGet]
[OutputCache(Duration = 3600, Location = OutputCacheLocation.Client, VaryByParam = "id")]
public virtual ActionResult Image(Guid id)
{
   FileItem picture = FileService.GetItem(id);
   return picture != null ? File(picture.FileData, picture.ContentType) : null;
}

如果电子邮件无法在电子邮件客户端中正确呈现,则可以使用一个链接在浏览器中查看相同的邮件。

在浏览器中,所有图像均正确加载并显示,但是我的问题出在电子邮件客户端(在本例中为Outlook 2013和Outlook 2010)中,其中通过上述方法引用的图像不会仅加载静态图像。

例如,加载良好的图像元素将是一个静态文件,例如:

<img src="http://www.foo.com/es/spacer6.gif" width="1" height="8" border="0" alt="" />

不会正常加载的元素如下所示:

<img src="http://www.foo.com/Packages/Image/0c6d126d-8f62-4e28-9963-7377e73c0482" style="border-style:solid;border-bottom-width:1;border-right-width:1;border-top-width:1;border-left-width:1;border-color:#333;" alt="..." />

因此,两者都来自同一个域,只有一个是静态的,并且一个是通过上述控制器操作加载的。 我猜想Outlook客户端不喜欢这是一个到外部“资源”的链接这一事实,因为它不知道它是仅基于URL的图像。

无论如何,是否有将我的控制器操作更改为“欺骗” Outlook的方式,以为这仅仅是静态图像URL,还是有更好的方法来做到这一点?

我使用下一个代码舞会puresourcecod.com:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

...

public ActionResult Hello(string text)
{
    //Create new image
    Image img = new Bitmap(100, 50);
    Graphics g = Graphics.FromImage(img);

    //Do some drawing
    Font font = new Font("Arial", 24);
    PointF drawingPoint = new PointF(10, 10);

    g.DrawString(text, font, Brushes.Black, drawingPoint);

    //Return Image
    MemoryStream ms = new MemoryStream();
    img.Save(ms, ImageFormat.Png);

    ms.Position = 0;

    return new FileStreamResult(ms, "image/png");
}

首先,确保picture.ContentType包含其应包含的内容(例如,如果图像是PNG,则为“ image / png”)。

否则,Outlook可能依赖于具有“正确的”扩展名。 要找出答案,您可以在guid-URL中添加适当的扩展名,然后使用以下命令:

public virtual ActionResult Image(string id)
{
    string s = id.Substring(0, id.IndexOf(".")); // a "." is now required
    Guid guid = Guid.Parse(s);
    FileItem picture = FileService.GetItem(guid);
    return picture != null ? File(picture.FileData, picture.ContentType) : null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM