确保你不要覆盖.Net MVC中的文件

时间:2015-11-09 22:56:38

标签: c# .net file

我创建了一个视图,它接受文件上传,我的控制器有一个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;   
        }

3 个答案:

答案 0 :(得分:2)

首先,不要检查是否存在,它对您没有任何帮助,因为在执行以下行之前可能会添加一个文件。您希望拥有Try...Catch块。而且你需要实际创建一个文件,而不仅仅是返回一个在某个执行点不存在的路径。

其次,将您从MVC创建文件的逻辑分开,因此Server.MapPathmodel.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;
}

很高兴为您服务!