如何确保服务器上的文件没有被同名文件覆盖
问题描述:
我有一个asp:FileUpload
控件将图像上传到本地的服务器。如何确保服务器上的文件没有被同名文件覆盖
它运行良好,但我决定测试如果用户上传与服务器上的现有映像具有相同文件名的映像,会发生什么情况。结果是原始图像被新图像覆盖。
我想写一些代码,如果相应的文件已经存在,将在文件名的末尾附加一个数字,但是我相信这有点有缺陷,因为用户仍然可以提供文件名附加一个数字,因此仍然覆盖。
什么是解决此问题的最佳方法?
答
您可以使用Globally Unique IDentifier来确保每个文件名都是唯一的。如果你想保留原始文件名,你可以用一个GUID作为前缀。
if (File.Exists(fileName))
{
fileName = Guid.NewGuid() + fileName;
}
答
因为总是有重复的文件名的机会,假设你有跟踪用户最初选择我只想用一个保证是唯一的一个名称的文件名(即一个GUID或一些主键),并跟踪服务器分配的文件名与数据库中用户指定的文件名之间的映射。
或者,如果您不必追踪原始文件名添加数字(或“副本”)也将工作 - 如果添加的数字已存在的文件名,只需添加另一个数字,所以上。这就是Windows在将文件复制到相同文件夹时默认执行的操作。
答
简单的回答:不要依赖用户提供正确的名称。
您应该为刚上传的文件创建一个唯一的文件名,然后将该文件保存在表中以便日后可以参考。
例如:
用户上传了一个名为foo.file
文件。当文件被上传你为它创建一个唯一的文件名,并在数据库表中存储的用户名,所以在表中的行会看起来像:
file_id | file_name | file_rname
1 39189f9381 foo.file
这样,您就不必担心文件被覆盖,但你仍然可以呈现用户选择的文件名,所以不会有任何混淆。
希望这可以帮助
正是我在找什么。谢谢! – 2012-03-08 14:14:00