服務熱線
153 8323 9821
最近在做ASP.NET 2.0的應用時候發現Session并不能很好的保存HtmlInputFile這個控件,具體表現是:如果客戶機和服務機是一臺的話(一般單機開發情況都是這樣)Session能很好的保存任何對象,但是如果把項目發布部署到真正的服務器上Session只能保存很小的一筆數據,對于稍微大點的文件就提示“無法訪問已關閉的文件”,意思應該是我的InputStream流早就關閉了,根本沒法再讀取了。查了一下ASP.NET 2.0的Web.config的配置也都沒能解決這個現象,索性不用Session來存儲了,改成Cache(ViewState也能存儲只是需要更新到頁面,效率很低,所以沒有采用)。前面說道了HtmlInputFile控件中包含了流對象,這樣控件無法被序列化也就沒有辦法直接保存到一個Cache對象中,所以我只好又寫了一個表示文件的類(CustomFile)來保存上傳文件的相關信息。
類定義,FileBytes是二進制文件的數據類型byte[],FileContentType文件MIME類型,FileSize文件的大小,FullFileName表示帶路徑的文件全名,最后還有一個SaveAs方法用來保存到服務器指定路徑中。
接下來的事情就是要把CustomFile這個類的實例都保存到Cache中,以便以后一次全部上傳到服務器。這樣的工作筆者通過一個用戶控件來實現,方便快捷。用戶通過“瀏覽”選擇本地文件,用“增加”把文件加載到指定Cache中,“刪除”可以刪除掉選擇錯的文件。控件的截圖
控件就一個最重要的對外屬性GetFiles,通過這個方法可以獲取保存在Cache中的CustomFile數組(即表示多個上傳文件)。
還有一個方法Clear是上傳后來清空Cache的,非常重要一定要使用,否則還會繼續上傳上次已經傳過的文件!!!
控件說明
文件上傳控件ID:FileUpload1
增加按鈕ID:btnAdd
刪除按鈕ID:btnDelete
文件列表ID:LbFiles
源代碼:
public partial class FileUploadControl : System.Web.UI.UserControl
{
/// <summary>
/// 預先定義一個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
{
上一篇:圖片向上滾動(一格一格的)