2012-03-08 52 views
0

我有一个asp:FileUpload控件将图像上传到本地的服务器。如何确保服务器上的文件没有被同名文件覆盖

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

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

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

回答

1

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

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

正是我在找什么。谢谢! – 2012-03-08 14:14:00

0

因为总是有重复的文件名的机会,假设你有跟踪用户最初选择我只想用一个保证是唯一的一个名称的文件名(即一个GUID或一些主键),并跟踪服务器分配的文件名与数据库中用户指定的文件名之间的映射。

或者,如果您不必追踪原始文件名添加数字(或“副本”)也将工作 - 如果添加的数字已存在的文件名,只需添加另一个数字,所以上。这就是Windows在将文件复制到相同文件夹时默认执行的操作。

1

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

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

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

1

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

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

例如:

用户上传了一个名为foo.file文件。当文件被上传你为它创建一个唯一的文件名,并在数据库表中存储的用户名,所以在表中的行会看起来像:

file_id | file_name | file_rname 
1    39189f9381  foo.file 

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

希望这可以帮助