如何做到上传文件时不重名?

postcha 2012-03-23 06:50:43
我现在用的上传方法如下:

foreach(string upload in Request.Files)
{
if (Request.Files[upload].ContentLength<=0) continue;
string year = DateTime.Now.Year.ToString();
string month = DateTime.Now.Month.ToString("00");
string day = DateTime.Now.Day.ToString("00");
//string fileFolder = string.Concat("Upload/", year, "/", month, "/", day);
string fileFolder = string.Concat(year, "/", month, "/", day);
string path = HostingEnvironment.MapPath("~/" + "Upload/" + fileFolder);

if (!Directory.Exists(path))
{
//在Upload目录下创建了一个文件夹
Directory.CreateDirectory(path);
}
string filename = Request.Files[upload].FileName;

string fileType = Path.GetExtension(Request.Files[upload].FileName).ToLower();//取文件扩展名带"."
string nickName = Path.GetFileName(Request.Files[upload].FileName);
string tempfiletype = fileType.Substring(1);//取文件扩展名不带"."
Random ran = new Random();
string name = DateTime.Now.ToString("yyyyMMdhhmmss") + ran.Next(9999) + fileType;
Request.Files[upload].SaveAs(Path.Combine(path, name));
AddTempAttachment(nickName, "/" + fileFolder + "/" + name, Convert.ToInt32(Session["userid"]), tempfiletype);
}


AddTempAttachment方法的代码如下:

public void AddTempAttachment(string tempFilename, string tempPath,int tempUserID,string tempFileType)
{
tempAttachment newatt = new tempAttachment() { tempFilename = tempFilename, tempPath = tempPath, tempUerID = tempUserID, tempFileType =tempFileType };
db.tempAttachments.Add(newatt);
db.SaveChanges();
}


是用MVC3,在view中是用

@using (Html.BeginForm("AddArticle", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="editor-label">
上传文件:
</div>
<div class="editor-field">
<input name="file1" id="file1" type="file" /><br />
<input name="file2" id="file2" type="file" /><br />
<input name="file3" id="file3" type="file" />
</div>

<p>
<input type="submit" value="添加" />
</p>
}



目前,在上传文件时,会有重名现象发生。
string filename = Request.Files[upload].FileName;

string fileType = Path.GetExtension(Request.Files[upload].FileName).ToLower();//取文件扩展名带"."
string nickName = Path.GetFileName(Request.Files[upload].FileName);
string tempfiletype = fileType.Substring(1);//取文件扩展名不带"."
Random ran = new Random();
string name = DateTime.Now.ToString("yyyyMMdhhmmss") + ran.Next(9999) + fileType;如我同时上传三个文件,就有可能发生文件重名,主要是ran.Next(9999)这里生成的随机数不会变,有时又是好的

注:我是在本地调试时发生情况,是不是本地测试速度比较快的缘故?

所以,这个问题应该如解决掉?
...全文
220 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yp19910928 2012-03-24
  • 打赏
  • 举报
回复
string name = DateTime.Now.ToString("yyyyMMdhhmmss") + ran.Next(9999) + fileType;
mavisziyou 2012-03-24
  • 打赏
  • 举报
回复
就用GUID吧。
Im_Sorry 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chinajiyong 的回复:]

1、Guid.NewGuid().ToString("N") 结果为:
38bddf48f43c48588e0d78761eaa1ce6
2、Guid.NewGuid().ToString("D") 结果为:
57d99d89-caab-482a-a0e9-a0a803eed3ba
3、Guid.NewGuid().ToString("B") 结果为:
{09f……
[/Quote]

+1
ycproc 2012-03-24
  • 打赏
  • 举报
回复

建议使用时间+文件名的 方式
风一样的大叔 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yyl8781697 的回复:]

引用 3 楼 happytonice 的回复:

string name = DateTime.Now.ToString("yyyyMMdhhmmss") + ran.Next(9999) + fileType;
加上毫秒

++++ 这个就几乎不会重名了
[/Quote]这个最简单
porschev 2012-03-24
  • 打赏
  • 举报
回复

时间戳加几位随机数。。。
yyl8781697 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happytonice 的回复:]

string name = DateTime.Now.ToString("yyyyMMdhhmmss") + ran.Next(9999) + fileType;
加上毫秒
[/Quote]
++++ 这个就几乎不会重名了
EnForGrass 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sp1234 的回复:]

引用楼主 postcha 的回复:
string fileType = Path.GetExtension(Request.Files[upload].FileName).ToLower();//取文件扩展名带"."
string nickName = Path.GetFileName(Request.Files[upload].FileName);
string tempfiletype……
[/Quote]
你如果要用Random函数,就像P哥说的,把 Random ran = new Random()定义成static
insus 2012-03-24
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
[Quote=引用楼主 postcha 的回复:]
string fileType = Path.GetExtension(Request.Files[upload].FileName).ToLower();//取文件扩展名带"."
string nickName = Path.GetFileName(Request.Files[upload].FileName);
string tempfiletype = fileType.Substring(1);//取文件扩展名不带"."
Random ran = new Random();
string name = DateTime.Now.ToString("yyyyMMdhhmmss") + ran.Next(9999) + fileType;如我同时上传三个文件,就有可能发生文件重名,主要是ran.Next(9999)这里生成的随机数不会变,有时又是好的。
[/Quote]

new Random()与当前时钟有关。如果连续new它,随机发生器的种子很可能是相同的。就算你把ran声明到页面范畴,也是不对的。因为asp.net的web服务程序时线程并行的。

应该把你的ran声明为static的变量。只是在类型第一次被访问时new一次。
lele1028265767 2012-03-24
  • 打赏
  • 举报
回复
GUID,时间毫秒+1恶搞的话还可以随即往上再加一些东西
色拉油 2012-03-24
  • 打赏
  • 举报
回复
还是GUID最安全
liuyilin888 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happytonice 的回复:]
string name = DateTime.Now.ToString("yyyyMMdhhmmss") + ran.Next(9999) + fileType;
加上毫秒
[/Quote]
ok
qxyywy 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chinajiyong 的回复:]

用GUID可以不
[/Quote]

这个可以
但我一般用当前时间等做文件名
kelaideman2010 2012-03-24
  • 打赏
  • 举报
回复
根据上传数量在循环之外先把使用的几个不同ran.Next(9999) 给确定了?
我爱小土豆 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chinajiyong 的回复:]
1、Guid.NewGuid().ToString("N") 结果为:
38bddf48f43c48588e0d78761eaa1ce6
2、Guid.NewGuid().ToString("D") 结果为:
57d99d89-caab-482a-a0e9-a0a803eed3ba
3、Guid.NewGuid().ToString("B") 结果为:
{09f140d5-a……
[/Quote]这个很好的,还可以用楼上的所说的加上时间就可以了
happytonice 2012-03-23
  • 打赏
  • 举报
回复
string name = DateTime.Now.ToString("yyyyMMdhhmmss") + ran.Next(9999) + fileType;
加上毫秒
EnForGrass 2012-03-23
  • 打赏
  • 举报
回复
1、Guid.NewGuid().ToString("N") 结果为:
38bddf48f43c48588e0d78761eaa1ce6
2、Guid.NewGuid().ToString("D") 结果为:
57d99d89-caab-482a-a0e9-a0a803eed3ba
3、Guid.NewGuid().ToString("B") 结果为:
{09f140d5-af72-44ba-a763-c861304b46f8}
4、Guid.NewGuid().ToString("P") 结果为:
(778406c2-efff-4262-ab03-70a77d09c2b5)
EnForGrass 2012-03-23
  • 打赏
  • 举报
回复
用GUID可以不

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧