我从填写的用户表单帖子[使用使用iframes的工具]接收文件上传异步]] 我正在做的是在表单页面上设置一个隐藏GUID的字段,我将其传递给查询字符串中的iframe。然后iframe页面使用一种基本方法处理上传,其中它为目录提供guid的前2个字符,为子目录提供下两个字符,基本上是为了防止在1个目录中有数千个文件。
我的问题是这个。如果用户上传图片并且从不提交表单,则应删除该文件我正在考虑使用缓存对象,因为这是单个服务器环境。因此,在文件发布后,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 :(得分:2)
只是一个想法,但你不能先将文件上传到暂存文件夹吗?提交表单时将文件移动到最终位置。假设在一定时间之后仍然在暂存文件夹中的任何文件已被放弃&amp;然后使用定期运行的脚本删除它们。
答案 1 :(得分:0)
您是否考虑过在Global.asax中使用Session_End()
来清理文件?我从未使用过这个活动。我可能是错的但是我的理解是在会话因超时或注销而终止后才会被解雇。
根据guid的前4个字符创建文件夹结构不是唯一的。会发生碰撞。使用整个GUID作为文件夹名称。您可以将GUID存储在数据库中,然后检索GUID并扫描下载目录,删除找到的目录。
Windows临时目录在.Net Path.GetTempFileName()