ASP.NET 上傳圖片至資料庫並讀取圖片顯示

來源:互聯網
上載者:User

今天,和大家討論一下在ASP.NET中,如何上傳圖片至資料庫,然後再將圖片讀取顯示的問題。歡迎高手提出自己的方法!!!

目前,我主要用到以下兩種方法:

1:上傳圖片的相對路徑到資料庫中相應欄位裡,讀取顯示時,將控制項(假設用的是Image控制項)的ImageUrl屬性指向該相對路徑即可。

2:將圖片以二進位流的方式整體上傳到資料庫裡,讀取顯示時,以二進位流的方式整體讀出。這種方法稍微麻煩一點,但儲存的是圖片整體到資料庫裡。

第一種方法,實現起來比較簡單,因為存入資料庫裡的只是圖片相對路徑,當然,同時也就有很大的局限性,由於是相對路徑,所以當本地的圖片變換了位置

或移除,或是在其他主機上瀏覽該圖片時,就無法顯示了。第二種方法,就比較靈活了,可以用在互動性的頁面,比如校友錄,因為上傳的是整張圖片,所

以只要讀取正確,就能任何主機上顯示出來。

下面,分別通過實際的代碼,介紹這兩種方法。

在這兩個方法裡,我將用到一個控制項:FileUpload,該控制項的具體用法參見百度Google。。。學習過程中,最好的老師就是他們倆。

1:上傳圖片相對路徑,並讀取顯示。

資料庫裡的欄位很簡單,就兩個
Image_ID    int    identity(1,1)     primarykey    not null
Image_Wpath    varchar(50)        null
Image_Wpath 用來儲存圖片的相對路徑

很簡單的介面(其實是有點醜。。。。):


這裡注意,我需要上傳的檔案都放在檔案夾“Image”,在後面的上傳路徑裡就需要這個檔案夾。

下面是:


我在輸入框裡填入Image_ID的值,讀取指定的圖片,在圖片的下面,顯示出該圖片的相對路徑。

接下來,我們看一下具體代碼實現上傳和讀取顯示功能。

在項目裡,有一個sqlHelper類,是一些常用的資料存取方法。這裡就不詳細講了。

上傳按鈕裡的事件:

CODE:

protected void Button1_Click(object sender, EventArgs e)
{
       string name = FileUpload1.FileName;       //擷取檔案名稱
       string type = name.Substring(name.LastIndexOf(".") + 1);    //擷取檔案類型
       string ipath = Server.MapPath("Image") + "\\" + name;    //擷取檔案路徑
       string wpath = "Image\\" + name;        //[color=red]設定檔案儲存相對路徑(這裡的路徑起始就是我們存放圖片的檔案夾名)[/color]

       string query1 = "insert into Images values('" + wpath + "')";

       if (type == "jpg" || type == "gif" || type == "bmp" || type == "png")
       {
         FileUpload1.SaveAs(ipath);        //伺服器儲存路徑
         sqlHelper.ExecterNonQuery(query1);
       }
}
顯示按鈕事件:

CODE:

protected void Button2_Click(object sender, EventArgs e)
{
       string query2 = "select * from Images where Image_ID=" + Convert.ToInt32(TextBox1.Text);
       SqlDataReader sdr = sqlHelper.GetReader(query2);
       string wpath2 = "";
       while (sdr.Read())
       {
         wpath2 = sdr[1].ToString();    //獲得相對路徑
       }
       sdr.Close();
       Image1.ImageUrl = wpath2;    //圖片顯示路徑就是相對路徑
       Label1.Text = wpath2;    //顯示相對路徑
}
2:以二進位流的方式存入資料庫,並讀取顯示。

資料庫的欄位同樣簡單:
Image_ID    int    identity(1,1)     primarykey    not null
Image_Content     image null
Image_Content以二進位形式儲存圖片

整體看一下例子裡的頁面組成:


上傳圖片頁面和第一種方法一樣,同樣是用到FileUpload,以及一個Button,具體代碼如下:

CODE:

protected void Button1_Click(object sender, EventArgs e)
{
       string name = FileUpload1.PostedFile.FileName;
       string type = name.Substring(name.LastIndexOf(".") + 1); 
       FileStream fs = File.OpenRead(name);
       byte[] content = new byte[fs.Length];
       fs.Read(content, 0, content.Length);
       fs.Close();

       SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Pooling=False;Password=");
       SqlCommand cmd = conn.CreateCommand();
       conn.Open();
       cmd.CommandText = "insert into Images(Image_Content) values (@content)";
       cmd.CommandType = CommandType.Text;

       if (type == "jpg" || type == "gif" || type == "bmp" || type == "png")
       {
         SqlParameter para = cmd.Parameters.Add("@content", SqlDbType.Image);
         para.Value = content;
         cmd.ExecuteNonQuery();
       }
}
顯示一張圖片和顯示一組圖片有所不同,將會分別說明之。

顯示一張圖片,要用到Default.aspx和Default2.aspx。Default.aspx中有一個控制項Image,它的屬性ImageUrl指向Default2.aspx用於顯示圖片。Default2.aspx用於

讀取圖片。



Default.aspx.cs

CODE:

protected void Page_Load(object sender, EventArgs e)
{

       Image1.ImageUrl = "Default2.aspx";
}
Default2.aspx.cs

CODE:

       string imgid = Request.QueryString["imgid"];
       SqlConnection conn1 = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=sa;Pooling=False;Password=");
       SqlCommand cmd1 = new SqlCommand("select Image_Content from Images where Image_ID=3", conn1);     //固定顯示Image_ID為3的圖片
       conn1.Open();
       SqlDataReader sdr = cmd1.ExecuteReader();
       if (sdr.Read())
       {
         Response.BinaryWrite((byte[])sdr["Image_Content"]);
       }
       Response.End();
顯示一組圖片時,用ashx Handle存放圖片。同時用GridView以列顯示圖片。Image控制項綁定Image_ID。



allimage.aspx

CODE:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="allimage.aspx.cs" Inherits="allimage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<HTML xmlns="http://www.w3.org/1999/xhtml"> 
<HEAD runat="server"> 
<title>BindImg</title> 
</HEAD> 
<body> 
<form id="Form1" method="post" runat="server"> 
<FONT face="宋體"> 
<asp:DataGrid id="MyDataGrid" runat="server" AutoGenerateColumns="False" Width="632px"> 
<AlternatingItemStyle BackColor="Beige"></AlternatingItemStyle> 
<HeaderStyle HorizontalAlign="Center"></HeaderStyle> 
<Columns> 
<asp:TemplateColumn HeaderText="Photo"> 
<ItemTemplate> <asp:Image ID="Image1" runat="server" Height="70px" ImageUrl='<%# "Getimg.ashx?id="+Eval("Image_ID") %>'
       Width="100px" />
</ItemTemplate> 
</asp:TemplateColumn> 
</Columns> 
</asp:DataGrid></FONT> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:PracticeConnectionString %>"
       SelectCommand="SELECT * FROM [Images]"></asp:SqlDataSource>
</form> 
</body> 
</HTML>
allimage.aspx.cs

CODE:

protected void Page_Load(object sender, EventArgs e)
{
       MyDataGrid.DataSource = SqlDataSource1;
       MyDataGrid.DataBind();
}
Getimg.ashx

CODE:

<%@ WebHandler Language="C#" Class="Getimg" %>

using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

public class Getimg : IHttpHandler {

public void ProcessRequest (HttpContext context)
{
       int id = int.Parse(context.Request.QueryString["id"]);
       SqlConnection conn = new SqlConnection(@"server=;database=;uid=;pwd=");
       SqlCommand cmd = new SqlCommand("select Image_Content from Images where Image_ID='" + id + "'", conn);
       cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
       conn.Open();
       SqlDataReader dr = cmd.ExecuteReader();
       if (dr.Read())
       {
         context.Response.BinaryWrite((byte[])dr["Image_Content"]); 
       }
       dr.Close();
}

public bool IsReusable {
       get {
         return false;
       }
}

}
總結:
兩種圖片上傳及讀取顯示方法,各有優點,個人更傾向於用第二種。因為第二種方法達到了真正的將圖片上傳到資料庫。在某些項目中,我們也可能要用到第一種方法。本例中,沒有嚴格的判斷圖片上傳的格式,學習的朋友可以自己做嚴格判斷,防止上傳的是有害檔案。如果您也好的上傳圖片及顯示圖片的方法,不妨跟帖討論,謝謝。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.