如何在asp.net mvc中正确显示数据库中的图像列表?

时间:2014-02-20 21:16:57

标签: c# asp.net-mvc

我的要求是从数据库中获取图像并显示在前端。在我的情况下,我使用的是asp.net MVC。数据库ir oracle和图像的数据类型是blob。以下是我的代码

型号

这是该类的模型,它有两个属性ImageDisplayImageStream

public class SelectionModel
{
    public byte[] ImageDsiplay { get; set; }
    public MemoryStream ImageStream { get; set;}
}

控制器代码

在控制器中,我正在尝试从数据库中获取图像并分配给模型。

public ActionResult Index()
{
    SelectionModel sel = new SelectionModel();

    List<SelectionModel> lissel = new List<SelectionModel>();
    byte[] imagedata;

    string sql = "select filecontent from filestore";

    OracleConnection con = new OracleConnection(ConStr);
    OracleCommand com = new OracleCommand(sql, con);

    try
    {
        con.Open();

        OracleDataReader dr;

        dr = com.ExecuteReader();

        while (dr.Read())
        {
            imagedata = (byte[])dr[0];

            sel.ImageDsiplay = imagedata;

            var stream = new MemoryStream(sel.ImageDsiplay);

            sel.ImageStream = stream;

            lissel.Add(sel);
        }
    }
    catch (Exception ex)
    {
        // ??
    }

    //Here i am trying to return the list .

    return View(lissel);
}

查看代码

以下是视图代码,它应该显示图像。

@model IEnumerable<GoldForGold.Models.SelectionModel>

<table>
    <tr>
        <td>        
            @foreach (var item in Model)
            {
                <img  src="@Url.Action("Index", "Selection")" alt="myimage" />
            }
        </td>
    </tr>
</table>

问题

问题是我无法显示数据库中的图像。图像没有显示。我已经尝试了很长一段时间,但无法找出问题

2 个答案:

答案 0 :(得分:0)

从历史上看,我曾使用IHttpHandler来做这类事情。像这样:

public class EmployeePhotoHandler : IHttpHandler
{
    public bool IsReusable { get { return false; } }

    public void ProcessRequest(HttpContext context)
    {
        int employeeID;
        if (!int.TryParse(context.Request.QueryString["ID"], out employeeID))
            return;

        EmployeePhoto photo = EmployeeService.GetPhotoByEmployee(EmployeeService.GetEmployeeByID(employeeID));
        if (photo == null || photo.Photo == null)
            return;

        context.Response.ContentType = "image/jpeg";
        context.Response.BinaryWrite(photo.Photo);
    }
}

答案 1 :(得分:0)

我在控制器中使用WebImage类来动态渲染和调整DB中的图像大小:

[ImageOutputCache(Duration = 18000)]
public void Image(int id)
{
    Image image = ImageDAL.SelectSingle(e => e.ImageId == id); //EF Model

    WebImage webimage = new WebImage(image.Data); //image.Data (byte[])

    //resize, crop etc

    webimage.Write();
}

以下是输出缓存的属性代码(否则缓存会输出text / html的内容类型):

    public class ImageOutputCache : OutputCacheAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);

            filterContext.HttpContext.Response.ContentType = "image/jpeg";
        }
    }