今天在测试多文件上传时出现一个问题:文件丢失!
起初以为是程序问题,后来发现是文件名的问题。经过调试,做以下分析、总结。
流行的多文件上传,都是上传之后,用日期时间命名。都认为方便、简单,似乎还能避免同目录下产生相同的文件。不错,我使用的也是这种方法,但是我自作聪明的在后面加了一个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