asp.net代码练习 work066 GDI+,图片文件上传到数据库保存的示例

258 篇文章 2 订阅

webform1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="work066.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>GDI+,图片文件上传到数据库保存的示例</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table border="0">
            <tr>
                <td>选择图片</td>
                <td>
                    <asp:FileUpload ID="FileUpload1" runat="server" />
                </td>
                <td>
                    <asp:Button ID="Button1" runat="server" Text="上传" OnClick="Button1_Click" />
                </td>
            </tr>
        </table>
        <hr />
        <asp:Button ID="Button2" runat="server" Text="GridView中显示图片" OnClick="Button2_Click" />
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="3" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px">
            <Columns>
                <asp:BoundField DataField="ID" HeaderText="编号"/>
                <asp:BoundField DataField="FileName" HeaderText="图片名称"/>
                <asp:BoundField DataField="FileLength" HeaderText="图片大小(字节)"/>
                <asp:BoundField DataField="Mime" HeaderText="MIME"/>
                <asp:BoundField DataField="UploadDate" HeaderText="上传时间"/>
                <asp:TemplateField HeaderText="查看图片">
                    <ItemTemplate>
                        <a href='WebForm2.aspx?id=<%#Eval("ID") %>'>查看</a>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <FooterStyle BackColor="White" ForeColor="#000066" />
            <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
            <RowStyle ForeColor="#000066" />
            <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
            <SortedAscendingCellStyle BackColor="#F1F1F1" />
            <SortedAscendingHeaderStyle BackColor="#007DBB" />
            <SortedDescendingCellStyle BackColor="#CAC9C9" />
            <SortedDescendingHeaderStyle BackColor="#00547E" />
        </asp:GridView>
    </div>
    </form>
</body>
</html>

webform1.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace work066
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        //上传
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile)
            {
                string fileName = FileUpload1.FileName;
                int fileLength = FileUpload1.PostedFile.ContentLength;
                string mime = FileUpload1.PostedFile.ContentType;
                byte[] fileData = FileUpload1.FileBytes;

                //所有图片文件的MIME都是已image开始的
                if (mime.StartsWith("image/"))
                {
                    string sql = "insert into FileList(FileName,FileData,FileLength,Mime) values(@fName,@fData,@fLength,@fMime)";
                    System.Data.SqlClient.SqlParameter[] parameters = new System.Data.SqlClient.SqlParameter[4];

                    parameters[0] = new System.Data.SqlClient.SqlParameter();
                    parameters[0].ParameterName = "@fName";
                    parameters[0].SqlDbType = System.Data.SqlDbType.NVarChar;
                    parameters[0].SqlValue = 50;
                    parameters[0].Value = fileName;

                    parameters[1] = new System.Data.SqlClient.SqlParameter();
                    parameters[1].ParameterName = "@fData";
                    parameters[1].SqlDbType = System.Data.SqlDbType.Image;
                    parameters[1].SqlValue = int.MaxValue;
                    parameters[1].Value = fileData;

                    parameters[2] = new System.Data.SqlClient.SqlParameter();
                    parameters[2].ParameterName = "@fLength";
                    parameters[2].SqlDbType = System.Data.SqlDbType.Int;
                    parameters[2].SqlValue = 4;
                    parameters[2].Value = fileLength;

                    parameters[3] = new System.Data.SqlClient.SqlParameter();
                    parameters[3].ParameterName = "@fMime";
                    parameters[3].SqlDbType = System.Data.SqlDbType.VarChar;
                    parameters[3].SqlValue = 20;
                    parameters[3].Value = mime;

                    System.Data.SqlClient.SqlConnectionStringBuilder bu = new System.Data.SqlClient.SqlConnectionStringBuilder();
                    bu.DataSource = "(local)";
                    bu.InitialCatalog = "test";
                    bu.UserID = "sa";
                    bu.Password = "123456";

                    SqlDbHelper helper = new SqlDbHelper();
                    helper.ConnectionString = bu.ConnectionString;

                    if (helper.ExecuteNonQuery(sql, System.Data.CommandType.Text, parameters) > 0)
                    {
                        Response.Write("<script>javascript:window.alert('上传成功');</script>");
                    }
                    else
                    {
                        Response.Write("<script>window.alert('上传失败');</script>");
                    }

                }
                else
                {
                    Response.Write("<script>window.alert('请上传图片');</script>");
                }

            }
            else
            {
                Response.Write("<script>window.alert('请上传文件');</script>");
            }
        }

        //显示
        protected void Button2_Click(object sender, EventArgs e)
        {
            System.Data.SqlClient.SqlConnectionStringBuilder bu = new System.Data.SqlClient.SqlConnectionStringBuilder();
            bu.DataSource = "(local)";
            bu.InitialCatalog = "test";
            bu.UserID = "sa";
            bu.Password = "123456";

            string sql = "select * from FileList";
            SqlDbHelper helper = new SqlDbHelper(bu.ConnectionString);
            GridView1.DataSource = helper.ExecuteDataTable(sql);
            GridView1.DataBind();

        }
    }
}

webform2.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace work066
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            int fileID = 0;

            //如果传过来的参数能转换为数字
            if(int.TryParse(Request.QueryString["id"],out fileID))
            {
                System.Data.SqlClient.SqlConnectionStringBuilder bu = new System.Data.SqlClient.SqlConnectionStringBuilder();
                bu.DataSource = "(local)";
                bu.InitialCatalog = "test";
                bu.UserID = "sa";
                bu.Password = "123456";

                SqlDbHelper robot1 = new SqlDbHelper(bu.ConnectionString);

                string sql = "select * from FileList where ID=@id";
                System.Data.SqlClient.SqlParameter[] paras = new System.Data.SqlClient.SqlParameter[1];
                paras[0] = new System.Data.SqlClient.SqlParameter("@id",System.Data.SqlDbType.Int,4);
                paras[0].Value = fileID;

                System.Data.SqlClient.SqlDataReader reader = robot1.ExecuteReader(sql, System.Data.CommandType.Text, paras);

                byte[] data = null;
                string mime = string.Empty;
                //按编号查询,最多只有一条记录,所以使用if,没有使用while循环
                if (reader.Read())
                {
                    data = reader["FileData"] as byte[]; //强制转换
                    mime = (string)(reader["mime"]);    //强制转换,两种方式相同
                }
                //读取数据之后要关闭
                reader.Close();

                //如果图片有数据
                if(data != null && data.Length > 0)
                {
                    Response.Clear(); //先清空
                    Response.ContentType = mime; //设定页面为mime图片对应的格式
                    System.IO.MemoryStream mStream = new System.IO.MemoryStream(data); //利用内存流,读图片

                    System.Drawing.Bitmap image = new System.Drawing.Bitmap(mStream); //从内存流中,生成位图图片
                    image.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg); //将图片保存至页面输出流中
                    image.Dispose(); //释放图片对象
                    Response.End();
                }
            }
        }
    }
}

sqldbhelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace work066
{
    /// <summary>
    /// asp.net 三层架构
    /// 针对sql server数据库操作的通用类
    /// 作者:虾米大王
    /// 日期:2021年6月1日
    /// 版本: 1.0
    /// </summary>
    public class SqlDbHelper
    {

        private string _connectionString;

        /// <summary>
        /// 构造函数
        /// </summary>
        public SqlDbHelper()
        {

        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="connectionString">数据库的连接字符串</param>
        public SqlDbHelper(string connectionString)
        {
            this._connectionString = connectionString;
        }

        /// <summary>
        /// 设置数据库连接字符串
        /// </summary>
        public string ConnectionString
        {
            set
            {
                this._connectionString = value;
            }
        }

        /// <summary>
        /// 执行查询,返回DataTable结果集
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <param name="cmdType">执行语句的类型,可以是存储过程或者SQL文本</param>
        /// <param name="parameters">执行语句的参数数组</param>
        /// <returns>DataTable结果集</returns>
        public System.Data.DataTable ExecuteDataTable(string sql, System.Data.CommandType cmdType, System.Data.SqlClient.SqlParameter[] parameters)
        {
            System.Data.DataTable table1 = new System.Data.DataTable();

            //使用using,是为了包含其中的代码执行结束后自动关闭
            using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(this._connectionString))
            {
                using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, con))
                {
                    cmd.CommandType = cmdType;
                    if (parameters != null)
                    {
                        foreach (System.Data.SqlClient.SqlParameter para in parameters)
                        {
                            cmd.Parameters.Add(para);
                        }
                    }
                    System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(cmd);
                    adapter.Fill(table1);
                }
            }

            return table1;
        }

        /// <summary>
        /// 执行查询,返回DataTable结果集(函数同名,重构)
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <returns>DataTable结果集</returns>
        public System.Data.DataTable ExecuteDataTable(string sql)
        {
            return ExecuteDataTable(sql, System.Data.CommandType.Text, null);
        }

        /// <summary>
        /// 执行查询,返回DataTable结果集(函数同名,重构)
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <param name="cmdType">执行语句的类型,可以是存储过程或者SQL文本</param>
        /// <returns>DataTable结果集</returns>
        public System.Data.DataTable ExecuteDataTable(string sql, System.Data.CommandType cmdType)
        {
            return ExecuteDataTable(sql, cmdType, null);
        }

        /// <summary>
        /// 执行查询,返回一个SqlDataReader的对象实例
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <param name="cmdType">执行语句的类型,可以是存储过程或者SQL文本</param>
        /// <param name="parameters">参数数组</param>
        /// <returns>SqlDataReader对象实例</returns>
        public System.Data.SqlClient.SqlDataReader ExecuteReader(string sql, System.Data.CommandType cmdType, System.Data.SqlClient.SqlParameter[] parameters)
        {
            System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(this._connectionString);
            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, con);
            if (parameters != null)
            {
                foreach (System.Data.SqlClient.SqlParameter para in parameters)
                {
                    cmd.Parameters.Add(para);
                }
            }
            con.Open();
            //执行行为,关闭reader,同时自动关闭con
            return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        }

        /// <summary>
        /// 执行查询,返回一个SqlDataReader的对象实例(函数同名,重构)
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <returns>SqlDataReader对象实例</returns>
        public System.Data.SqlClient.SqlDataReader ExecuteReader(string sql)
        {
            return ExecuteReader(sql, System.Data.CommandType.Text, null);
        }

        /// <summary>
        /// 执行查询,返回一个SqlDataReader的对象实例(函数同名,重构)
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <param name="cmdType">SqlDataReader对象实例</param>
        /// <returns>SqlDataReader对象实例</returns>
        public System.Data.SqlClient.SqlDataReader ExecuteReader(string sql, System.Data.CommandType cmdType)
        {
            return ExecuteReader(sql, cmdType, null);
        }

        /// <summary>
        /// 执行查询,返回结果集为首行首列的值
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <param name="cmdType">执行语句的类型,可以是存储过程或者SQL文本</param>
        /// <param name="parameters">参数数组</param>
        /// <returns>首行首列的值</returns>
        public Object ExecuteScalar(string sql, System.Data.CommandType cmdType, System.Data.SqlClient.SqlParameter[] parameters)
        {
            object result = null;

            using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(this._connectionString))
            {
                using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, con))
                {
                    cmd.CommandType = cmdType;

                    if (parameters != null)
                    {
                        foreach (System.Data.SqlClient.SqlParameter para in parameters)
                        {
                            cmd.Parameters.Add(para);
                        }
                    }
                    con.Open();
                    result = cmd.ExecuteScalar();
                }
            }

            return result;
        }

        /// <summary>
        /// 执行查询,返回结果集为首行首列的值
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <returns>首行首列的值</returns>
        public Object ExecuteScalar(string sql)
        {
            return ExecuteScalar(sql, System.Data.CommandType.Text, null);
        }

        /// <summary>
        /// 执行查询,返回结果集为首行首列的值
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <param name="cmdType">执行语句的类型,可以是存储过程或者SQL文本</param>
        /// <returns>首行首列的值</returns>
        public Object ExecuteScalar(string sql, System.Data.CommandType cmdType)
        {
            return ExecuteScalar(sql, cmdType, null);
        }

        /// <summary>
        /// 对数据库执行增删改操作
        /// </summary>
        /// <param name="sql">执行的SQL语句</param>
        /// <param name="cmdType">执行语句的类型,可以是存储过程或者SQL文本</param>
        /// <param name="parameters">参数数组</param>
        /// <returns>受影响的行数</returns>
        public int ExecuteNonQuery(string sql, System.Data.CommandType cmdType, System.Data.SqlClient.SqlParameter[] parameters)
        {
            int count = 0;

            using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(this._connectionString))
            {
                using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, con))
                {
                    cmd.CommandType = cmdType;

                    if (parameters != null)
                    {
                        foreach (System.Data.SqlClient.SqlParameter para in parameters)
                        {
                            cmd.Parameters.Add(para);
                        }
                    }

                    con.Open();
                    count = cmd.ExecuteNonQuery();
                }
            }
            //执行insert,update,delete之后,返回的受影响行数
            return count;
        }

        /// <summary>
        /// 对数据库执行增删改操作(函数同名,重构)
        /// </summary>
        /// <param name="sql">执行的SQL语句</param>
        /// <returns>受影响的行数</returns>
        public int ExecuteNonQuery(string sql)
        {
            return ExecuteNonQuery(sql, System.Data.CommandType.Text, null);
        }

        /// <summary>
        /// 对数据库执行增删改操作(函数同名,重构)
        /// </summary>
        /// <param name="sql">执行的SQL语句</param>
        /// <param name="cmdType">执行语句的类型,可以是存储过程或者SQL文本</param>
        /// <returns>受影响的行数</returns>
        public int ExecuteNonQuery(string sql, System.Data.CommandType cmdType)
        {
            return ExecuteNonQuery(sql, cmdType, null);
        }

        /// <summary>
        /// 返回当前数据库中,由用户创建的所有表
        /// </summary>
        /// <returns>DataTable结果集</returns>
        public System.Data.DataTable GetTables()
        {
            System.Data.DataTable table1 = null;

            using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(this._connectionString))
            {
                con.Open();
                table1 = con.GetSchema("Tables");
            }

            return table1;
        }
    } 
}

sql

create table FileList(
	ID bigint identity(1,1) not null,
	FileName nvarchar(50) not null,
	FileData image not null,
	FileLength int not null,
	Mime varchar(20) not null,
	UploadDate datetime null default getdate(),
	primary key(id) 
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾米大王

有你的支持,我会更有动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值