服務(wù)熱線
153 8323 9821
最近在做ASP.NET 2.0的應(yīng)用時(shí)候發(fā)現(xiàn)Session并不能很好的保存HtmlInputFile這個(gè)控件,具體表現(xiàn)是:如果客戶機(jī)和服務(wù)機(jī)是一臺(tái)的話(一般單機(jī)開(kāi)發(fā)情況都是這樣)Session能很好的保存任何對(duì)象,但是如果把項(xiàng)目發(fā)布部署到真正的服務(wù)器上Session只能保存很小的一筆數(shù)據(jù),對(duì)于稍微大點(diǎn)的文件就提示“無(wú)法訪問(wèn)已關(guān)閉的文件”,意思應(yīng)該是我的InputStream流早就關(guān)閉了,根本沒(méi)法再讀取了。查了一下ASP.NET 2.0的Web.config的配置也都沒(méi)能解決這個(gè)現(xiàn)象,索性不用Session來(lái)存儲(chǔ)了,改成Cache(ViewState也能存儲(chǔ)只是需要更新到頁(yè)面,效率很低,所以沒(méi)有采用)。前面說(shuō)道了HtmlInputFile控件中包含了流對(duì)象,這樣控件無(wú)法被序列化也就沒(méi)有辦法直接保存到一個(gè)Cache對(duì)象中,所以我只好又寫(xiě)了一個(gè)表示文件的類(CustomFile)來(lái)保存上傳文件的相關(guān)信息。
類定義,FileBytes是二進(jìn)制文件的數(shù)據(jù)類型byte[],FileContentType文件MIME類型,FileSize文件的大小,FullFileName表示帶路徑的文件全名,最后還有一個(gè)SaveAs方法用來(lái)保存到服務(wù)器指定路徑中。
接下來(lái)的事情就是要把CustomFile這個(gè)類的實(shí)例都保存到Cache中,以便以后一次全部上傳到服務(wù)器。這樣的工作筆者通過(guò)一個(gè)用戶控件來(lái)實(shí)現(xiàn),方便快捷。用戶通過(guò)“瀏覽”選擇本地文件,用“增加”把文件加載到指定Cache中,“刪除”可以刪除掉選擇錯(cuò)的文件。控件的截圖
控件就一個(gè)最重要的對(duì)外屬性GetFiles,通過(guò)這個(gè)方法可以獲取保存在Cache中的CustomFile數(shù)組(即表示多個(gè)上傳文件)。
還有一個(gè)方法Clear是上傳后來(lái)清空Cache的,非常重要一定要使用,否則還會(huì)繼續(xù)上傳上次已經(jīng)傳過(guò)的文件!?。?/span>
控件說(shuō)明
文件上傳控件ID:FileUpload1
增加按鈕ID:btnAdd
刪除按鈕ID:btnDelete
文件列表ID:LbFiles
源代碼:
public partial class FileUploadControl : System.Web.UI.UserControl
{
/// <summary>
/// 預(yù)先定義一個(gè)Cache名稱
/// </summary>
private string _vName = "MyFile";
private ArrayList _FileInfo = new ArrayList();
private CustomFile Files
{
set
{
if ( Cache["" + _vName + ""] != null )
{
_FileInfo = (ArrayList) Cache["" + _vName + ""];
}
else
_FileInfo = new ArrayList();
_FileInfo.Add( value );
Cache["" + _vName + ""] = _FileInfo;
}
}
/// <summary>
/// 獲取自定義上傳文件類
/// </summary>
public CustomFile[ ] GetFiles
{
get
{