我的要求是从数据库中获取图像并显示在前端。在我的情况下,我使用的是asp.net MVC。数据库ir oracle和图像的数据类型是blob。以下是我的代码
型号
这是该类的模型,它有两个属性ImageDisplay
和ImageStream
。
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>
问题
问题是我无法显示数据库中的图像。图像没有显示。我已经尝试了很长一段时间,但无法找出问题
答案 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";
}
}