(转载)数据库存取图片并在MVC3中显示在View中

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

本文简单介绍数据库中图片的存取方法,并在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(0);

    }

   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 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, 0, 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 。

时间: 2024-10-08 06:04:36

(转载)数据库存取图片并在MVC3中显示在View中的相关文章

android 数据库存取图片

Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢迎,他们认为,在很多数据库语言里,处理大字段都是不容易的,像图片这样的文件放在数据库里会有问题:对数据库的读写速度永远赶不上文件系统的处理速度,使数据库变得巨大:但也有很多人认为像图片这样的数据存放在数据库中也有好处:易于备份,且备份速度绝对比备份文件快,比较容易数据迁移等等.其实这两种方法都有优缺

jquery mobile中显示加载中提示框和关闭提示框

在jquery mobile开发中,经常需要调用ajax方法,异步获取数据,如果异步获取数据方法由于网速等等的原因,会有一个反应时间,如果能在点击按钮后数据处理期间,给一个正在加载的提示,客户体验会更好一些. 先看两个方法,显示和关闭,方法来自于参考:http://blog.csdn.net/zht666/article/details/8563025 <script> //显示加载器 function showLoader() { //显示加载器.for jQuery Mobile 1.2.

查询中显示MySQL表中的行号

如果我们要想在查询中显示MySQL表的行号,这里我们需要借助在查询语句中定义一个变量.因为MySQL没有专门的显示行号的函数,这一点不像Oracle中的rownum 先来看一个MySQL数据库的表截图,这个截图是没有行号的显示效果 下面为了显示行号的SQL SELECT (@rownum:=@rownum+1) rownum, a.imgPath FROM tb_goods_img a,(SELECT (@rownum:=0)) b 有行号的截图如下 技术提升:我们一起来思考一个问题,虽然上面的

复习课程jdbc:使用配置文件properties进行连接数据库,数据库存取图片,批处理,时间戳,事物回滚等等

使用配置文件properties进行连接数据库 首先创建一个file自定义文件名,但是后缀名必须改为.properties(不分大小写):如config.properties: 然后双击config.properties进行编辑:此文件数据是根据键值对来存储的:我们可以把连接数据库的一些连接字符串存储在此文件里:然后用的时候直接读配置文件,到时候更换的时候方便移植和修改. name                                                          

小谈c#数据库存取图片的方式

代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> /// <summary> /// 上传图片 /// </summary> /// <param name="FUSShopURL">FileUpload对象</param> /// <param name="Upl

Java 操作MySQL数据库存取图片以及其它类型文件

一.需要注意的一个问题 1.当数据库字段为blob类型时,必须使用PreparedStatement中的setBinaryStream(int,InputStream,int)方法: 2.当数据库字段为longblob类型时,必须使用PreparedStatement中的setBinaryStream(int,InputStream,long)方法. 否则就会抛出如题的错误: Exception in thread "main" java.lang.AbstractMethodErro

数据库存取图片(只是自己学习的记录不保证正确性)

第一步://获取当前选择的图片 this.pictureBox1.Image = Image.FromStream(this.openFileDialog1.OpenFile()); //获取当前图片的路径 string path = openFileDialog1.FileName.ToString(); //将制定路径的图片添加到FileStream类中 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);

数据库存取图片

private void button1_Click(object sender, EventArgs e) //窗体打开文件图片 { openFileDialog1.Filter = "@.jpg|*.jpg|all files|*.*"; DialogResult dr = openFileDialog1.ShowDialog(); if (dr == DialogResult.OK) { FileStream fs = new FileStream(openFileDialog1

C++ CEF 浏览器中显示 Tooltip(标签中的 title 属性)

在 Windows 中将 CEF 集成到 C++ 客户端以后,默认是无法显示 tooltip 的,比如图片标签中的 title 属性. 实现的方式其实很简单,按下面的步骤操作就可以: 创建一个文本文件,文件名为 app.manifest,内容如下,将这个文件放到源代码文件夹 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="