2011-06-08 120 views
1

我正在從填寫的用戶表單文章[使用使用iframe的工具]接收文件上傳異步] 我正在做的是在窗體頁面上設置一個隱藏的GUID字段我將它傳遞給查詢字符串中的iframe。然後,iframe頁面使用基本方法處理上載,從而使用guid的前2個字符作爲目錄,而接下來的2個作爲子目錄,基本上防止1個目錄中有數千個文件。asp.net緩存目標文件刪除

我的問題是這樣的。如果用戶上傳圖片並且從不提交表單,則應刪除文件我正在考慮使用緩存對象,因爲這是單個服務器環境。因此,在文件發佈時,fileupload頁面會檢查緩存對象是否存在postid,如果它發現它刪除現有文件[他們上傳文件然後更改爲新文件],它會將新文件寫入磁盤。我的問題是如果他們上傳文件,並且從不提交我需要刪除文件的表單。我猜我可以使用緩存對象中的委託來解決這個問題?就像表單提交它會使緩存對象失效一樣,它永不過期,並將其作爲一個好文件記錄在數據庫中,如果超過20分鐘,緩存對象將刪除其關鍵字中的任何文件名。這裏是我到目前爲止的代碼

protected void Page_Load(object sender, EventArgs e) 
    { 
     string PostID = Request.QueryString["a"]; 
     HttpFileCollection hfc = Request.Files; 
      for (int i = 0; i < hfc.Count; i++) 
      { 
       HttpPostedFile hpf = hfc[i]; 
       if (hpf.ContentLength > 0) 
       { 

        if (Cache[PostID] != null) 
        { 
     File.Delete(Server.MapPath("~/Uploads/") + 
     Cache[PostID].ToString().Substring(0,2) + 
     Cache[PostID].ToString().Substring(2,2) + "/" + Cache[PostID].ToString()); 
        } 
        System.IO.FileInfo fe = new System.IO.FileInfo(PostID); 
        string extension = fe.Extension; 
        string Directory1 = PostID.Substring(0, 2); 
        string Directory2 = PostID.Substring(2, 2); 
        if (!Directory.Exists(Server.MapPath("~/Uploads/") + 
         Directory1)) 
        { 
         Directory.CreateDirectory(Server.MapPath("~/Uploads/") + 
         Directory1); 
        } 
        if (!Directory.Exists(Server.MapPath("~/Uploads/") + 
        Directory1 + "/" + Directory2)) { 
         Directory.CreateDirectory(Server.MapPath("~/Uploads/") + 
         Directory1 + "/" + Directory2); 
        } 
        hpf.SaveAs(Server.MapPath("~/Uploads/") + 
        Directory1 + "/" + Directory2 + "/" + 
        PostID + "." + extension); 

        Cache.Insert("PostID", 
        PostID + extension, 
        null, 
        System.Web.Caching.Cache.NoAbsoluteExpiration, 
        TimeSpan.FromMinutes(20)); 
       } 
      }   
+0

我現在意識到,asp.net緩存對象不是進程間共享,當他們試圖上傳另一個文件緩存對象一個進程使用可能無法使用所以我放棄了這種方法,除非有人有一個好主意,而只是使用數據庫調用。更慢但更可靠。 – Jordan 2011-06-08 21:17:07

回答

2

只是一個想法,但不能上傳文件到暫存文件夾?提交表單時,將文件移至最終位置。假設在一段時間後仍然存在於暫存文件夾中的任何文件已被廢棄&然後使用定期運行的腳本將其刪除。

0

您是否考慮在Global.asax中使用Session_End()來清理文件?我從來沒有使用過這個事件。我可能是錯的,但是我的理解是,在會話被超時或註銷終止之後,它會被解僱。

基於guid的前4個字符創建文件夾結構不是唯一的。碰撞會發生。使用整個GUID作爲文件夾名稱。您可以將GUID存儲在數據庫中,稍後檢索GUID並掃描下載目錄以除去找到的目錄。

Windows臨時目錄是.NET中可Path.GetTempFileName()