在网上找不到特定的需求.然后自己试着写了一下.功能算是完成。图片上传数据库,就是把图片文件保存在数据库的一个字段.SQL image格式是个二进制的集合。
先看数据库设计.
create table ImageFiles(
Id int identity(1,1) primary key,
ImageFile image not null
)
这个是最简化版.问题关键是如何读取数据库的image,然后显示在aspx页面. 之前一直考虑.〈asp:image 标签的
ImageUrl属性,本来是放连接地址的.因数据库不是保存图片地址,而是直接保存图片的.怎么获取呢?提供了个方法
可以建立个新的项目(一般处理程序),这个类继承了 IHttpHandler,文件为ashx格式。HttpHandler用java的理解
就像个servlet,用来处理请求的方法.先看页面后台如何处理.
Code
public partial class _Default : System.Web.UI.Page
{
//为了简化,这里直接用了Linq to SQL
private static ImagesDataContext db = new ImagesDataContext();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) {
BindMethod();
}
}
private void BindMethod()
{
var list = (from im in db.ImageFiles select im).ToList(); //用tolist是要获取所有对象的list集合。
GridView1.DataSource = list;
GridView1.DataBind();
}
protected void btnUpdate_Click(object sender, EventArgs e)
{
byte[] images = FileUpload1.FileBytes; //文件上传控件,这里把图片读成byte[]格式
ImageFiles imagefile=new ImageFiles();
imagefile.ImageFile = images;
db.ImageFiles.InsertOnSubmit(imagefile); //调用了Linq插入数据库方法,这里封装了个imagefile对象
db.SubmitChanges();
BindMethod();
}
}
好了.看关键的handler如何写了.需要实现IHttpHandler接口,
Code
public class Handler : IHttpHandler {
private static ImagesDataContext db = new ImagesDataContext();
public void ProcessRequest (HttpContext context) { //页面提交或者动态绑定通过HttpContext获取
int id = Convert.ToInt32(context.Request.QueryString["cid"]);
if (id != 0) //这里判断很关键.和下面的response.Redirect形成了个循环,遍历了页面的所有id
{
ImageFiles image = new ImageFiles();
var pic = (from c in db.ImageFiles
where c.Id == id
select new { c.ImageFile }).Single();
byte[] showpic = pic.ImageFile.ToArray();
image.ImageFile = showpic;
int count = image.ImageFile.Length; //图片完整输出,所有长度
context.Response.ContentType = "image/jpeg"; //图片的输出类型
context.Response.OutputStream.Write(showpic, 0, count); //在输出流,就是context用输出流输出图片
context.Response.End();
}
else {
context.Response.Redirect("~/Default.aspx");
}
}
//这里用默认值
public bool IsReusable {
get {
return false;
}
}
}
最后看页面如何调用
Code
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="FileUpload1" runat="server" />
</div>
<asp:Button ID="btnUpdate" runat="server" onclick="btnUpdate_Click" Text="上传" />
<br />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField HeaderText="图片">
<ItemTemplate> <!--把ID作为循环的参数,绑定到ImageUrl,通过调用handler的请求处理输出图像 -->
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("Id","~/Handler.ashx?cid={0}" )%>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</form>
</body>
好了.大功告成!当然,应该还有其他更加好的方法.这里先抛砖引玉。