数据库存取图片并在MVC3中显示在View中

根据路径读取图片:
byte[] img = System.IO.File.ReadAllBytes(@"d:\xxxx.jpg");

简介:在有些情况下需要将图片转换为二进制流存放在数据库中,当显示时再从数据库中读出来显示在界面上。

本文简单介绍数据库中图片的存取方法,并在MVC3中显示在Razor视图中。仅供初学者参考学习。

1. 将图片转换为二进制流

/// <summary>

/// convert a picture file to byte array        

/// </summary>        

 public byte[] GetBytesFromImage(string filename)        

{            

  FileStream fs = new FileStream(filename,FileMode.Open,FileAccess.Read);            

  int length = (int)fs.Length;            

  byte[] image = new byte[length];            

  fs.Read(image, 0, length);            

  fs.Close();            

  return image;        

}

  

2. 将二进制文件写入数据库

/// <summary>

///  write byte array to database

/// </summary>

public void StoreImageToDB(byte[] image)

{    

  string connectionString = "Data Source=.;Initial Catalog=MyDB;User Id=sa;Password=123456";    

  string strSql = "INSERT INTO TestImage(image) Values(@image)";

     using (SqlConnection connection = new SqlConnection(connectionString))    

  {        

    SqlCommand cmd = new SqlCommand(strSql,connection);        

    cmd.Parameters.Add("@image", SqlDbType.Image).Value = image;        

    connection.Open();

    cmd.ExecuteNonQuery();        

    cmd.Clone();    

   }

}

  

3. 从数据库中读取图片

/// <summary>

/// get image from database

/// </summary>

public byte[] GetBytesFromDB()

 {    

  string connectionString = "Data Source=.;Initial Catalog=MyDB;User Id=sa;Password=123456";    

  string strSql = "SELECT top 1 image FROM TestImage";

     using (SqlConnection connection = new SqlConnection(connectionString))    

  {        

    SqlCommand cmd = new SqlCommand(strSql,connection);        

    connection.Open();

           SqlDataReader reader = cmd.ExecuteReader();        

    byte[] temp = null;        

    if (reader.Read())        

    {            

       temp = (byte[])reader.GetValue();        

    }        

    return temp;    

  }

}

4. 在Controller中添加返回图片的方法

/// <summary>

/// Action that return the image file

 /// </summary>

 public FileResult Image()

{   

    //get image from database   

    byte[] image = GetBytesFromDB();

      //return the image to View   

    return new FileContentResult(image, "image/jpeg");

    //or like below   

   //MemoryStream mem = new MemoryStream(image, 0, image.Length);   

   //return new FileStreamResult(mem, "image/jpg");

}

5. 在View中显示图片, 将src指定为我们返回图片的Action方法

<img alt="" src="/Home/Image" />

上面的方法都是我们自己实现且用SQL语句存取数据库,其实.NET框架已经给我们封装好了

很多现成的类,再加上 EF 存取数据库可以使我们的代码变得更加 elegant。

1. 前台上传图片

@using (Html.BeginForm("Edit", "Admin", FormMethod.Post, 

    new { enctype = "multipart/form-data" })) {

<div>Upload new image: <input type="file" name="Image" /></div>

<input type="submit" value="Save" />

}

它相当于 webform 中的 :

<form action="/Admin/Edit" enctype="multipart/form-data" method="post">

enctype = "multipart/form-data" 告诉浏览器将我们的文件流 post 到后台。

2. 将图片存入数据库

[HttpPost]

public ActionResult Edit(Product product, HttpPostedFileBase image) {

  if (ModelState.IsValid) {

  if (image != null) {

  product.ImageMimeType = image.ContentType;

  product.ImageData = new byte[image.ContentLength];

  image.InputStream.Read(product.ImageData, , image.ContentLength);

  }

  // save the product

  repository.SaveProduct(product);

  return RedirectToAction("Index");

  } else {

  // there is something wrong with the data values

  return View(product);

  }

}

MVC框架会自动封装实例化我们的实体类和文件流并传到 post 方法中。

其中 HttpPostedFileBase 是一个抽象类,实际传过来的对象

是它的子类 HttpPostedFileWrapper 对象。

HttpPostedFileBase 类定义了很多操作文件流的属性和接口。

3. 在 view 中请求显示图片的 action

<img src="@Url.Action("GetImage", "Product", new { Model.ProductID })" />

其中读取图片流的方法如下:

public FileContentResult GetImage(int productId) {

  Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productId);

  if (prod != null) {

  return File(prod.ImageData, prod.ImageMimeType);

  } else {

  return null;

   }

}

其中 FileContentResult  是 ActionResult 的子类 ,action 的返回类型有很多种,它们都继承自抽象类 ActionResult 。

MVC中根据后台绝对路径读取图片并显示在IMG中的更多相关文章

  1. 根据url路径获取图片并显示到ListView中

    项目开发中我们需要从网络获取图片显示到控件中,很多开源框架如Picasso可以实现图片下载和缓存功能.这里介绍的是一种简易的网络图片获取方式并把它显示到ListView中. 本案例实现的效果如下: 项 ...

  2. C# 图片保存到数据库和从数据库读取图片并显示

    图片保存到数据库的方法: public void imgToDB(string sql)        {   //参数sql中要求保存的imge变量名称为@images            //调 ...

  3. 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法

    在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法   ==========方法1: --------1. 选相应 ...

  4. Java连接MySQL数据库。编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计。

    题目2:编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计.之后,可根据显示的内容进行某条记录的删除(以id为条 ...

  5. C#中winform使用相对路径读取文件的方法

    http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73b6cd0d3027fa3cf1fd579080101 ...

  6. web项目中从不同的路径读取文件

    项目中的配置文件可以放在classpath下,webapp下获取其他任何一个指定的绝对地址,读取这些文件就从这三个地方去找.主要代码如下: private List<String> get ...

  7. 从npz文件中读取图片并显示的小例子

    前提:我把自己的数据集存成了npz的形式,也就是npy的压缩形式.如果电脑上安装了解压软件,双击npz文件的话,会出现每一部分压缩文件的名字例如npz文件的名称为:mnist.npz文件,用好压解压软 ...

  8. Python中Opencv和PIL.Image读取图片的差异对比

    近日,在进行深度学习进行推理的时候,发现不管怎么样都得不出正确的结果,再仔细和正确的代码进行对比了后发现原来是Python中不同的库读取的图片数组是有差异的. image = np.array(Ima ...

  9. 用Seam实现:图片上传 + 保存到数据库 + 从数据库读出图片并显示到页面中

    上传图片并保存到数据库 seam给我们提供了 s:fileUpload 标签以完成文件上传功能.使用该标签时,要在web.xml中声明一个Seam的过滤器: <filter> <fi ...

随机推荐

  1. 多浏览器书签同步插件EverSync

    有时上网时会遇到浏览器不能正常显示的问题.(比如我的火狐浏览器无法正确显示微信公众号管理后台,在chrome上可以正常显示),所以我的电脑里安装了chrome和firefox两个浏览器.但是时间长了, ...

  2. pm2 启动模式 fork 和 cluster 的区别

    fork模式,单实例多进程,常用于多语言混编,比如php.python等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码. 缺点就是单服务器实例容易由于异常会导致服务器实例崩溃. ...

  3. 1045-Access denied for user 'root'@'localhost'解决方法

    1.出现这个问题的原因之一是权限的问题,也就是说你的电脑可能没有权限访问mysql数据库. 讲道理这种情况其实基本上不该遇到,因为我们在安装mysql之后,root其实是有最高权限的,而且很少会有人去 ...

  4. java定时任务框架Quartz入门与Demo搭建

  5. In Vitro model验证 | Harnessing single-cell genomics to improve the physiological fidelity of organoid-derived cell types

    Transcriptional benchmarking of in vitro cells to in vivo with single-cell rna-seq - 简介 Harnessing s ...

  6. linux 下nc 命令的使用

    linux 下nc 命令的使用 https://blog.51cto.com/samyubw/555247

  7. 段地址机制以及段地址转换触发segmentation falt

    推动存储管理方式从固定分区到动态分区分配,进而又发展到分页存储管理方式的主要动力是提高内存利用率.可以实现一个内存用于多个程序同时执行而不会发生地址冲突.引入分段存储管理方式的目的,则主要是为了满足用 ...

  8. IfcBeam属性

    IfcBeam属性和结构 <xs:element name="IfcBeam" type="ifc:IfcBeam" substitutionGroup= ...

  9. 查找算法(4)--Fibonacci search--斐波那契查找

    1.斐波那契查找 (1)说明 在介绍斐波那契查找算法之前,我们先介绍一下很它紧密相连并且大家都熟知的一个概念——黄金分割. 黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二, ...

  10. php mysql 根据经纬度计算距离和排序

    #.两点距离(1.4142135623730951) ,),point(,)); ORDER BY distance; mysql 5.6 添加 #.两点球面距离(.0357231545m) ,),p ...