在现代Web开发中,文件上传功能是常见的需求之一。本文将介绍如何使用ASP.NET和SQL Server实现文件上传功能,并将文件存储到数据库中。将创建一个简单的示例,包括前端表单设计、数据库表的创建、存储过程的编写,以及后端代码的实现。
首先,需要在SQL Server数据库中创建一个表来存储文件信息。这个表名为File,包含以下列:
CREATE TABLE [dbo].[File](
[FileId] [int] IDENTITY(1,1) NOT NULL,
[Filename] [varchar](100) NULL,
[Extension] [varchar](8) NULL,
[ContentType] [varchar](50) NULL,
[Document] [varbinary](50) NULL,
CONSTRAINT [PK_File] PRIMARY KEY CLUSTERED (
[FileId] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
这个表使用FileId作为主键,其他列分别存储文件名、扩展名、内容类型和文件内容(二进制格式)。
为了将文件保存到数据库中,需要创建一个存储过程。这个存储过程名为spFile_Add,它接受文件名、扩展名、内容类型和文件内容作为参数,并将这些信息插入到File表中。
CREATE PROCEDURE spFile_Add
@Filename varchar(100),
@Extension varchar(8),
@ContentType varchar(50),
@Document varbinary(50)
AS
BEGIN
INSERT INTO [File](Filename, Extension, ContentType, Document)
VALUES (@Filename, @Extension, @ContentType, @Document)
SELECT SCOPE_IDENTITY()
END
存储过程使用SCOPE_IDENTITY()函数返回新插入行的FileId。
接下来,需要创建一个ASP.NET表单,允许用户选择文件并提交。这个表单包含一个文件输入控件和一个按钮。
<form id="frmMain" runat="server">
<div>
<input type="file" id="txtFile" title="Browse for file which you want to save" Runat="server" />
<input id="btnSave" type="button" value="Save" onclick="document.frmMain.submit()" />
</div>
</form>
用户可以通过文件输入控件选择要上传的文件,然后点击“Save”按钮提交表单。
在ASP.NET的后端代码中,需要处理文件上传请求,并将文件信息保存到数据库中。以下是处理文件上传的代码示例:
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using System.IO;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
if (txtFile.PostedFile != null && txtFile.PostedFile.ContentLength > 0)
{
string filename = Path.GetFileName(txtFile.PostedFile.FileName);
string extension = Path.GetExtension(filename);
string contentType = txtFile.PostedFile.ContentType;
byte[] document = new byte[txtFile.PostedFile.ContentLength];
int fileId = AddFile(filename, extension, contentType, document);
}
}
}
protected int AddFile(string filename, string extension, string contentType, byte[] document)
{
SqlDatabase sqlDatabase = new SqlDatabase(ConfigurationManager.ConnectionStrings["dbConnString"].ConnectionString);
string sql = "spFile_Add";
SqlCommand sqlCommand = sqlDatabase.GetStoredProcCommand(sql) as SqlCommand;
Object obj = null;
try
{
sqlDatabase.AddInParameter(sqlCommand, "@Filename", SqlDbType.VarChar, filename);
sqlDatabase.AddInParameter(sqlCommand, "@Extension", SqlDbType.VarChar, extension);
sqlDatabase.AddInParameter(sqlCommand, "@ContentType", SqlDbType.VarChar, contentType);
sqlDatabase.AddInParameter(sqlCommand, "@Document", SqlDbType.VarBinary, document);
obj = sqlDatabase.ExecuteScalar(sqlCommand);
if (obj != null)
return int.Parse(obj.ToString());
else
return 0;
}
catch (Exception err)
{
throw new ApplicationException(err.Message);
}
}