ASP.net之图片上传(保存在SQL数据库)

在网上找不到特定的需求.然后自己试着写了一下.功能算是完成。图片上传数据库,就是把图片文件保存在数据库的一个字段.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,用来处理请求的方法.先看页面后台如何处理.

 

 

ContractedBlock.gif ExpandedBlockStart.gif 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接口,

ContractedBlock.gif ExpandedBlockStart.gif 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;
        }
    }

}

最后看页面如何调用

 

 

ContractedBlock.gif ExpandedBlockStart.gif 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>

好了.大功告成!当然,应该还有其他更加好的方法.这里先抛砖引玉。

 

转载于:https://www.cnblogs.com/drek_blog/archive/2009/06/13/1502594.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值