如何确保服务器上的文件不会被同名文件覆盖

时间:2012-03-08 13:43:40

标签: c# asp.net file-upload upload

我有一个asp:FileUpload控件可以将图像上传到我的本地服务器。

它运行良好,但我决定测试如果用户上传的图像与服务器上的现有图像具有相同的文件名,会发生什么。结果是原始图像被新图像覆盖。

我想写一些代码,如果相应的文件已经存在,会在文件名的末尾附加一个数字,但是我认为这有点有缺陷,因为用户仍然可以提供一个文件名附加数字,因此仍然覆盖。

解决此问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

您可以使用Globally Unique IDentifier确保每个文件名都是唯一的。如果要保留原始文件名,可以在其前面加上GUID。

if (File.Exists(fileName))
{
   fileName = Guid.NewGuid() + fileName;
}

答案 1 :(得分:1)

在数据库中存储fileNamefriendlyFileName字段。在后一个字段中跟踪原始文件名以进行显示,并在前者中存储GUID(请参阅.NET的Guid结构)。

然后,显然使用唯一标识符来命名上传产生的物理文件。

根据大小,性质,访问速度等因素,您可以将这些文件作为二进制文件存储在数据库中 - 无论这是一个好主意本身是一个辩论 - 至少有一个优势在“独立”系统中这样的组织也是如此。

答案 2 :(得分:1)

简单回答:不要依赖用户提供正确的名称。

您应该为刚刚上传的文件创建唯一的文件名,然后将该文件保存在表中,以便以后可以引用它。

例如:

用户上传名为foo.file的文件。上传文件时,为其创建一个唯一的文件名,并将用户名存储在数据库表中,因此表中的一行如下所示:

file_id    |  file_name   |   file_rname
1             39189f9381      foo.file

这样,您不必担心文件被覆盖,但您仍然可以显示用户选择的文件名,这样就不会有任何混淆。

希望这有帮助

答案 3 :(得分:0)

由于总是有可能存在重复的文件名,并且假设您必须跟踪用户最初选择的文件名,我只会使用保证唯一的名称(即GUID或某种主键)并跟踪服务器分配的文件名与数据库中用户指定的文件名之间的映射。

或者,如果您不必跟踪原始文件名,则添加数字(或“副本”)也将起作用 - 如果已添加数字的文件名已存在,则只需添加另一个数字,依此类推。这就是Windows在将文件复制到同一文件夹时默认执行的操作。