我创建了一个视图,它接受文件上传,我的控制器有一个http post方法,它基本上保存了db中的路径,然后将文件保存在app_data目录中。但是,我想确保文件不会写入另一个文件。即如果存在其他文件,请重命名。我知道我可以用两种方式做到这一点,要么通过确保所有文件名都是guid唯一的,要么重命名文件。我尝试过第二种方法,但我的方法似乎很麻烦。如果有人可以就是否有其他方法提出建议,我将不胜感激:
这就是我所拥有的:
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName); //Guid.NewGuid().ToString() + Path.GetExtension(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads/slides"), fileName);
if (System.IO.File.Exists(path))
{
for (int i = 1; true; i++)
{
path = Path.Combine(Server.MapPath("~/App_Data/uploads/slides"), (fileName + "_" + i));
if (!System.IO.File.Exists(path))
{
break;
}
}
}
file.SaveAs(path);
model.Image = path;
}
答案 0 :(得分:2)
首先,不要检查是否存在,它对您没有任何帮助,因为在执行以下行之前可能会添加一个文件。您希望拥有Try...Catch
块。而且你需要实际创建一个文件,而不仅仅是返回一个在某个执行点不存在的路径。
其次,将您从MVC创建文件的逻辑分开,因此Server.MapPath
和model.Image = path;
等代码将位于其他位置。
第三,时间戳听起来像是这里的最佳选择,只需确保包含毫秒。如果还不够,您可以在最后包含部分校验和,无论哪种方法使其独一无二。你仍然需要有代码来检查唯一性,即使它很少发生,只需重新生成文件名,也许等待50ms,以确保它是一个不同的文件名。
答案 1 :(得分:1)
希望这适合你:
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var fullFileName = fileName + "_" + Date.Now.ToString("yyyyMMdd_hhss")
path = Path.Combine(Server.MapPath("~/App_Data/uploads/slides"), fullFileName );
file.SaveAs(path);
model.Image = path;
}
答案 2 :(得分:1)
试试这个:
if (file != null && file.ContentLength > 0)
{
var extension = Path.GetExtension(file.FileName)
var fileName = Path.GetFileNameWithoutExtension(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads/slides"), fileName);
for (int i = 1; System.IO.File.Exists(path); i++)
path = Path.Combine(Server.MapPath("~/App_Data/uploads/slides"), fileName + "_" + i.ToString() + extension);
file.SaveAs(path);
model.Image = path;
}
很高兴为您服务!