2011-06-08 119 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()