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

C# 如何确保服务器上的文件不会被同名文件覆盖,c#,asp.net,file-upload,upload,C#,Asp.net,File Upload,Upload,我有一个asp:FileUpload控件将图像上传到本地服务器 它工作得很好,但是我决定测试如果用户上传与服务器上现有图像具有相同文件名的图像会发生什么。结果是原始图像被新图像覆盖 我曾想过编写一些代码,如果相应的文件已经存在,则会在文件名的末尾附加一个数字,但是我认为这有点缺陷,因为用户可能仍然能够提供附加数字的文件名,因此仍然会覆盖 解决此问题的最佳方法是什么?您可以使用来确保每个文件名都是唯一的。如果要保留原始文件名,可以使用GUID作为其前缀 if (File.Exists(fileNa

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

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

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

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

您可以使用来确保每个文件名都是唯一的。如果要保留原始文件名,可以使用GUID作为其前缀

if (File.Exists(fileName))
{
   fileName = Guid.NewGuid() + fileName;
}
您可以使用来确保每个文件名都是唯一的。如果要保留原始文件名,可以使用GUID作为其前缀

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

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


或者,如果您不必跟踪原始文件名,则添加编号(或“副本”)也会起作用-如果添加编号的文件名已经存在,只需添加另一个编号,依此类推。默认情况下,当您将文件复制到它来自的同一文件夹中时,Windows会这样做。

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


或者,如果您不必跟踪原始文件名,则添加编号(或“副本”)也会起作用-如果添加编号的文件名已经存在,只需添加另一个编号,依此类推。默认情况下,当您将文件复制到它来自的同一文件夹中时,Windows会执行此操作。

在数据库中存储
文件名和
友好文件名
字段。为了便于显示,请在后一个字段中跟踪原始文件名,并在前一个字段中存储a(请参见.NET的结构)

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


根据大小、性质、访问率等因素,您可以将这些文件作为二进制文件存储在数据库中-这是否是一个好主意本身就是一个争论-这样做的至少一个好处是在一个“独立”系统中这样组织。

在您的数据库中存储
文件名和
友好文件名
字段。为了便于显示,请在后一个字段中跟踪原始文件名,并在前一个字段中存储a(请参见.NET的结构)

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


根据大小、性质、访问率等因素,您可以将这些文件作为二进制文件存储在数据库中—这是否是一个好主意本身就是一个争论—这样做的至少一个好处是在“独立”系统中进行组织。

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

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

例如:

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

file_id    |  file_name   |   file_rname
1             39189f9381      foo.file
这样,您就不必担心文件被覆盖,但仍然可以显示用户选择的文件名,这样就不会有任何混淆


希望这有助于

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

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

例如:

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

file_id    |  file_name   |   file_rname
1             39189f9381      foo.file
这样,您就不必担心文件被覆盖,但仍然可以显示用户选择的文件名,这样就不会有任何混淆


希望这正是我想要的。谢谢正是我想要的。谢谢