【问题标题】:How to make sure that files on the server are not overwritten with files of the same name如何确保服务器上的文件不会被同名文件覆盖
【发布时间】:2012-03-25 23:45:15
【问题描述】:
我有一个asp:FileUpload 控件可以将图像上传到我的本地服务器。
它运行良好,但是我决定测试如果用户上传与服务器上现有图像具有相同文件名的图像会发生什么。结果是原始图像被新图像覆盖。
我想编写一些代码,如果相应的文件已经存在,则在文件名的末尾附加一个数字,但是我认为这有点缺陷,因为用户仍然可以提供带有数字附加,因此仍然覆盖。
解决这个问题的最佳方法是什么?
【问题讨论】:
标签:
c#
asp.net
file-upload
upload
【解决方案1】:
您可以使用Globally Unique IDentifier 来确保每个文件名都是唯一的。如果要保留原始文件名,可以在其前面加上 GUID。
if (File.Exists(fileName))
{
fileName = Guid.NewGuid() + fileName;
}
【解决方案2】:
由于总是存在重复文件名的机会,并且假设您必须跟踪用户最初选择的文件名,我只会使用保证唯一的名称(即 GUID 或某种主键) 并跟踪数据库中服务器分配的文件名和用户指定的文件名之间的映射。
或者,如果您不必跟踪原始文件名,添加数字(或“副本”)也可以 - 如果带有添加数字的文件名已经存在,只需添加另一个数字,依此类推.当您将文件复制到它来自的同一文件夹中时,Windows 默认会执行此操作。
【解决方案3】:
在您的数据库中存储fileName 和friendlyFileName 字段。在后一个字段中跟踪原始文件名以用于显示目的,并在前一个字段中存储GUID(参见.NET 的Guid 结构)。
然后,显然使用唯一标识符来命名上传产生的物理文件。
根据大小、性质、访问速率等,您可以将这些文件以二进制形式存储在数据库本身中——这是否是一个好主意本身就是一个争论——至少这样做的一个优势这样的组织在“独立”系统中也是如此。
【解决方案4】:
简单回答:不要依赖用户提供正确的名称。
您应该为刚刚上传的文件创建一个唯一的文件名,然后将该文件保存在一个表格中,以便您以后可以引用它。
例如:
用户上传了一个名为foo.file 的文件。上传文件后,您为其创建一个唯一的文件名并将用户名存储在数据库表中,因此表中的一行如下所示:
file_id | file_name | file_rname
1 39189f9381 foo.file
这样,您不必担心文件被覆盖,但您仍然可以显示用户选择的文件名,因此不会有任何混淆。
希望对你有帮助