ASP.NET中上传多文件时,用日期时间命名新文件,文件丢失问题

来源:互联网 发布:网络电力仪表 编辑:程序博客网 时间:2024/06/05 03:28

今天在测试多文件上传时出现一个问题:文件丢失!

起初以为是程序问题,后来发现是文件名的问题。经过调试,做以下分析、总结。

流行的多文件上传,都是上传之后,用日期时间命名。都认为方便、简单,似乎还能避免同目录下产生相同的文件。不错,我使用的也是这种方法,但是我自作聪明的在后面加了一个4位数随机数。在少文件上传的时候,一直很顺利,并未出现其它问题。代码如下:

Random ro = new Random();
String NewFileName = string.Format("{0}{1}{2}", time.ToString("yyMMddHHmmss"), ro.Next(1000, 9999), strExt);
但是以上代码会出现一个有趣的BUG:那就是当网站繁忙很多人同时上传的时候,或者一个人多文件同时上传的时候,你会发现,你传上去文件,经常性(跟别人)都是一样的,经常性“丢掉”一些图片。

经过查看数据库、文件分析:服务器处理太快了,几乎1秒内就处理你的多文件上传请求,这一秒内,所有的文件名都相同,导致后上传的文件覆盖了前上传的文件,造成文件“丢掉”了。(以上代码时间只能精确到秒)

OK,既然是文件名相同,我精确到毫秒,不就解决了?于是有了下面的代码:

Random ro = new Random();
String NewFileName = string.Format("{0}{1}{2}", time.ToString("yyMMddHHmmssff"), ro.Next(1000, 9999), strExt);

经过改造,丢失的可能性确实降低了,可是还是会有文件丢掉。

通过查阅文档,MSDN告诉我们:“Windows系统时钟精确到10~15毫秒”,也就是说我们的DateTime只能精确到10-15毫秒。如果用时间命名,即便精确到毫秒,10~15毫秒内处理的文件,名字仍然会相同。

故,不推荐使用日期时间命名文件。
那怎么办,想想怎么样可以让生成不重复的文件名呢?

这时我想到了GUID全球唯一标识符!代码实现如下:

String NewFileName = string.Format("{0}{1}", Guid.NewGuid().ToString("N"), strExt);


http://blog.renren.com/share/274178439/2539716282


原创粉丝点击