【问题标题】:not able to show image无法显示图像
【发布时间】:2013-12-31 12:50:45
【问题描述】:

这是我的模型

public class MyModel
{
   public System.Drawing.Image    MyImage             { get; private set; }

    public MyModel(System.Drawing.Image myImage)
    {
       this.MyImage             = myImage;
     }
}

这是我的看法

@model MyModel
@using MyNamespace.MyModels;           
@{
   ViewBag.Title = "title";
}
<img id="11111"  src="@Model.MyImage" alt="Hello alt text" />

这是我的控制器

public class MyController : Controller
{
   public ActionResult Index()
   {
      Image img = GoAndGetImage(55);
       MyModel model = new MyModel(img);
        return View(model);
    }

    private System.Drawing.Image GoAndGetImage(int id)
    {
            // Retrieve bytesArray from sql db, convert to System.Drawing.Image type
    }
}

但我只能看到 Hello alt text 而不是真实图像。我做错了什么?

【问题讨论】:

  • 读取生成的源码。您需要使用 data: URI,或发出单独的 HTTP 请求。

标签: c# asp.net-mvc-3


【解决方案1】:

您正在尝试将实际的物理位图从内存中传递到页面中。这行不通。

您需要:

a) 传入文件的字符串路径。即:

this.MyImage = "/your/path/to/file.jpg";

...和...

src="@Model.MyImage"

b) Base64 编码图像并将其转储到页面:

this.MyImage = base64String(ImageObject);

...和...

src="data:image/jpeg;base64,@Model.MyImage"

无论如何..MyImage 必须是字符串。

以下是将内存中的图像转换为 base64 的示例:Converting image to base64

我会提醒您不要经常从数据库中加载图像。如果您的站点上有很多用户,您将很快看到您的工作集猛增。最好将数据库作为查找。然后检查文件系统上是否存在文件。如果是,请使用文件系统上的文件。如果没有......从数据库中读取它并将其写入文件系统。然后,您可以在以后继续从文件系统加载该特定文件。

【讨论】:

  • 我相信第二种解决方案存在浏览器限制。图像也不会被缓存。他最好选择第一个。
  • 现在不支持它的浏览器列表非常少。除非要求支持非常旧的浏览器,否则应该没问题。
【解决方案2】:

src 属性必须是指向图像文件位置的 URL,而不是 System.Drawing.Image 类型的对象。

将您的MyImage 属性类型更改为String,将其设置为图像文件所在位置的相对(或绝对)路径,看看它是否有效。

【讨论】:

  • 我只是从数据库中读取这张图片;所以它不在位于文件系统上的文件中
  • 如果它存储在数据库中的 blob 中,您很可能必须将其保存为文件才能显示它。请参阅@Simon 的答案 - 您可以在不保存的情况下显示它。
猜你喜欢
  • 2015-11-06
  • 1970-01-01
  • 2016-06-28
  • 2012-06-30
  • 2019-12-29
  • 2021-06-24
相关资源
最近更新 更多