国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET中上傳文件到數據庫

2024-07-10 12:56:48
字體:
來源:轉載
供稿:網友
介紹

為什么要將文件保存到數據庫呢?理由很多,最直接的就是,將文件放入數據庫以后,可以對文件進行更好的管理,特別是文本文件、圖片等,如果不使用數據庫,數量巨大的時候,很難做到有效的管理和區別。特別是需要作一些與文字密切相關的應用的時候,將文件全部放入數據庫是最好的選擇,對文字的處理、檢索等,都可以直接利用數據庫的一些功能,可以做到真正的有效管理。本文舉例主要針對以文字為基礎的文件,比如word等,但是,實際上對程序稍微修改,就可以上傳所有文件類型。


數據表結構

現在,我們來看存放文件的數據庫表結構,這里,我們給出建立表的標準sql語句:

create table tblbooksupload

(

docid int not null identity primary key ,

doctitle varchar (200) ,

doc image,

doctype varchar (50) ,

entrydate datetime default getdate()

)

以上的語句中,我們看到數據表tblbooksupload包含五個字段:

字段docid是表的關鍵字段,數據記錄編號;

字段doctitle是用來簡單說明上傳文件的,如果上傳文本文件,我們一般將其設置為文件標題,圖像、程序等,就設置為圖像、程序的簡單介紹;

字段doc是用來存放我們上傳的文件的字段,注意,這里將doc字段的設置為image類別;

字段doctype用來保存我們上傳文件的類型,可能我們奇怪為什么要這個字段呢?其實,這個字段是很重要的,在用戶從數據庫取得數據的時候,這個字段將用來指定數據字段doc中數據的類別,然后,瀏覽器根據這個字段來決定呈現給用戶的數據;

字段datetime是一個時間字段,我們可以看到該字段的值取自服務器的當前日期。

下面是插入數據的存儲過程,我們來看具體代碼:

create procedure usp_booksuploadfile

@title varchar(200),

@doc image,

@doctype varchar(4)

as

insert tblbooksupload(doctitle,doc,doctype)

values (@title,@doc,@doctype)

go


上傳文件的步驟

現在,我們先從文字上了解一下上傳文件到數據庫的具體步驟,再從代碼上來實現:

首先,從客戶端取得上傳的文件,然后,我們將它放入數據流;

第二,服務器端讀取數據流,然后將其保存到緩存;

第三,將緩存數據保存到數據庫;

現在,我們一步步來看怎樣在程序中實現這些功能。


第一步

當然,首先我們要實現用戶在瀏覽器端自由選擇文件,然后上傳,這里用戶選擇文件,當然是要求標準的windows方式,所以,我們在這里使用form的file文件組件來給用戶選擇文件。注意,因為上傳文件,所以,在form的屬性設置的時候,我們應該設置為:multipart/form-data,這樣,才可以正確上傳文件。下面是上傳頁面的主要代碼:

<form id="frmupload" method="post" enctype="multipart/form-data" runat="server">

<span>title</span><br>

<asp:textbox id="txttitle" runat="server" enableviewstate="false"></asp:textbox>

<asp:requiredfieldvalidator id="valrtitle" runat="server" errormessage="*

required" controltovalidate="txttitle">* required</asp:requiredfieldvalidator>

<br>

<br>

<span>docutment to upload</span><br>

<input id="txtfilecontents" type="file" runat="server" name="txtfilecontents">

<br>

<br>

<asp:button id="btnsubmit" text="submit" runat="server"></asp:button>

</form>


第二步

我們可以將上傳的文件通過數據流保存到緩存,緩存的大小和文件的具體大小相同,我們可以使用以下的代碼來取得文件的具體大小:

int intdoclen = txtfilecontents.postedfile.contentlength;

然后,我們可以設置緩存的具體大小了:

byte[] docbuffer = new byte[intdoclen];

這樣設置以后,我們可以將上傳文件的內容保存到緩存中:

stream objstream;

objstream = txtfilecontents.postedfile.inputstream;

objstream.read(docbuffer,0,intdoclen);

在以上代碼中,讀取緩存的時候,從緩存的0位置開始,直到整個文件的長度,其實,這就是整個文件或者整個緩存的大小。

第三步

現在我們需要做的就是將緩存數據保存到數據庫,我們已經直到數據表結構,這樣,我們通過編寫簡單的sql語句就可以實現這個功能。在上面的內容中,我們編寫了一個存儲過程,在程序中,我們只要建立sqlcommand對象并且將這個存儲過程傳遞給它,并設置“@doc”參數取得緩存數據就可以了:

cmduploaddoc = new sqlcommand("usp_booksuploadfile",booksconn);

cmduploaddoc.commandtype = commandtype.storedprocedure;

cmduploaddoc.parameters.add("@title ",sqldbtype.varchar,200);

cmduploaddoc.parameters.add("@doc",sqldbtype.image);

cmduploaddoc.parameters.add("@doctype",sqldbtype.varchar,4);


cmduploaddoc.parameters[0].value = txttitle.text;

cmduploaddoc.parameters[1].value = docbuffer;

cmduploaddoc.parameters[2].value = strdoctype;


點擊按鈕處理代碼

private void btnsubmit_click(object sender, system.eventargs e)

{


string strdocext;

//strdoctype用于保存上傳文件的類型

string strdoctype;


//用于保存文件大小

int intdoclen;


//stream用于讀取上傳數據

stream objstream;


sqlconnection booksconn;

sqlcommand cmduploaddoc;


if(isvalid)

{

if(txtfilecontents.postedfile != null)

{

//文件類型

strdocext = cstring.right

(txtfilecontents.postedfile.filename,4).tolower();

switch(strdocext)

{

case ".doc":

strdoctype = "doc";

break;


case ".ppt":

strdoctype = "ppt";

break;


case ".htm":

strdoctype = "htm";

break;


case ".html":

strdoctype = "htm";

break;


case ".jpg":

strdoctype = "jpg";

break;


case ".gif":

strdoctype = "gif";

break;


default:

strdoctype = "txt";

break;

}

//上傳文件具體內容


intdoclen = txtfilecontents.postedfile.contentlength;

byte[] docbuffer = new byte[intdoclen];


objstream = txtfilecontents.postedfile.inputstream;


//文件保存到緩存

//緩存將保存到數據庫

objstream.read(docbuffer ,0,intdoclen);


booksconn = new

sqlconnection("server=server;uid=sa;database=books");


cmduploaddoc = new

sqlcommand("usp_booksuploadfile",booksconn);

cmduploaddoc.commandtype = commandtype.storedprocedure;

cmduploaddoc.parameters.add("@title ",sqldbtype.varchar,200);

cmduploaddoc.parameters.add("@doc",sqldbtype.image);

cmduploaddoc.parameters.add("@doctype",sqldbtype.varchar,4);

cmduploaddoc.parameters[0].value = txttitle.text;

cmduploaddoc.parameters[1].value = docbuffer ;

cmduploaddoc.parameters[2].value = strdoctype;


booksconn.open();

cmduploaddoc.executenonquery();

booksconn.close();

}

}

}


總結

以上我們提到的方法,適合所有類型的文件,對以上代碼作適當修改,我們就可以建立一個完全基于數據庫的文件管理系統。



最大的網站源碼資源下載站,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 岳西县| 哈巴河县| 韶关市| 苏尼特右旗| 浪卡子县| 大兴区| 南郑县| 长兴县| 修文县| 民丰县| 青龙| 绥芬河市| 桑植县| 南康市| 石家庄市| 沈阳市| 高阳县| 井冈山市| 满洲里市| 邮箱| 新野县| 平谷区| 景宁| 蚌埠市| 甘洛县| 苏州市| 西林县| 康马县| 霍州市| 平遥县| 吉木乃县| 酒泉市| 墨脱县| 福清市| 枣强县| 武汉市| 岚皋县| 嘉峪关市| 阿巴嘎旗| 延边| 镇巴县|