从MVC控制器操作渲染数据库图像

本文关键字:数据库 图像 操作 MVC 控制器 | 更新日期: 2023-09-27 18:26:11

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

最近,我更改了系统,允许最终用户配置邮件拍摄中的某些图像元素,而不是静态的。这些图像用GUID Id存储在数据库中,并通过如下所示的控制器操作加载:

[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,或者有没有更好的方法来做到这一点。

从MVC控制器操作渲染数据库图像

我使用下一个代码prom 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,则为"images/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;
}