MVC中根据后台绝对路径读取图片并显示在IMG中
数据库存取图片并在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中的更多相关文章
- 根据url路径获取图片并显示到ListView中
项目开发中我们需要从网络获取图片显示到控件中,很多开源框架如Picasso可以实现图片下载和缓存功能.这里介绍的是一种简易的网络图片获取方式并把它显示到ListView中. 本案例实现的效果如下: 项 ...
- C# 图片保存到数据库和从数据库读取图片并显示
图片保存到数据库的方法: public void imgToDB(string sql) { //参数sql中要求保存的imge变量名称为@images //调 ...
- 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法
在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法 ==========方法1: --------1. 选相应 ...
- Java连接MySQL数据库。编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计。
题目2:编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计.之后,可根据显示的内容进行某条记录的删除(以id为条 ...
- C#中winform使用相对路径读取文件的方法
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73b6cd0d3027fa3cf1fd579080101 ...
- web项目中从不同的路径读取文件
项目中的配置文件可以放在classpath下,webapp下获取其他任何一个指定的绝对地址,读取这些文件就从这三个地方去找.主要代码如下: private List<String> get ...
- 从npz文件中读取图片并显示的小例子
前提:我把自己的数据集存成了npz的形式,也就是npy的压缩形式.如果电脑上安装了解压软件,双击npz文件的话,会出现每一部分压缩文件的名字例如npz文件的名称为:mnist.npz文件,用好压解压软 ...
- Python中Opencv和PIL.Image读取图片的差异对比
近日,在进行深度学习进行推理的时候,发现不管怎么样都得不出正确的结果,再仔细和正确的代码进行对比了后发现原来是Python中不同的库读取的图片数组是有差异的. image = np.array(Ima ...
- 用Seam实现:图片上传 + 保存到数据库 + 从数据库读出图片并显示到页面中
上传图片并保存到数据库 seam给我们提供了 s:fileUpload 标签以完成文件上传功能.使用该标签时,要在web.xml中声明一个Seam的过滤器: <filter> <fi ...
随机推荐
- 【Beta】Phylab 发布说明
Phylab Beta阶段发布说明 一.发布地址 Phylab 二.新功能 1. Markdown(Html)报告生成 在生成报告界面可以选择报告生成方式:Latex或Markdown模板.目前支持M ...
- CCF认证 201903-4消息传递接口
题目 代码 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <stri ...
- VS 点击页面自动定位到解决方案资源管理器目录位置
点击工具→选项→项目和解决方案:勾上“在解决方案资源管理器中跟踪活动项”.
- 一句命令激活windows/office (https://03k.org/kms.html)
https://03k.org/kms.html 本站上线KMS服务~一句命令激活windows/office kissshot2015年11月1日 装机必备, 软件下载 240 条评论 服务器地址: ...
- Feign进行文件上传+表单调用
Feigin默认是不支持文件上传和表单提交的,需要做一些配置才能支持. 1.feign依赖 图中红色为form支持必须的jar. 2.添加自定义Encoder类: import static java ...
- 【C++】C++中的lambda表达式和函数对象
目录结构: contents structure [-] lambda表达式 lambda c++14新特性 lambda捕捉表达式 泛型lambda表达式 函数对象 函数适配器 绑定器(binder ...
- Solidity开发注意
pragma版本:1.版本要高于0.4.24才可以编译:2.高于0.5的版本则不可编译:3.第三位的版本号可以变,留出来用做bug可以修复(如0.4.1的编译器有bug,可在0.4.2修复,现有合约不 ...
- kotlin基础 字符串模板
${变量名} var tmp="字符串模板” print("今天学习${tmp}这个知识点")
- 求解未知数——yjy题库
/* 未知数 p1,p2,p3,p4,p5,满足: (1) p1 与 p3 均为 2 位的正整数:p5 为 3 位的正整数: (2) p2 与 p4 低两位(例:数值‘123’取低两位则为‘23’)数 ...
- Fiddler抓包Fiddler过滤
1.User Fiters启用 2.Action Action:Run Filterset now是否运行,Load Filterset加载,Save Filterset保存: 3.Hosts过滤 Z ...