为上载的文件创建唯一文件名/位置的策略

时间:2011-09-14 10:15:09

标签: asp.net-mvc file-upload

我的ASP.NET MVC应用接受上传的文件并将其存储在一个文件夹中。但是我想确保当用户上传文件时,应用程序接受任何文件名,但是当用户尝试上传具有相同文件名的文件时,这将失败。

我想我可以为每个文件创建单独的文件夹,但我想要一个干净平整的目录结构。目前我将GUID附加到文件名,但这不是一个很好的解决方案,因为当用户下载文件时会导致奇怪的文件名。 我想过将文件数据存储在数据库中,然后在请求时将其写入文件,但这是一个很大的开销。

任何替代方法?

1 个答案:

答案 0 :(得分:3)

为了使您的目录结构保持平坦存储您的文件,方法是附加一个GUID(就像您已经做过的那样)。在下载处理程序(控制器操作方法)中,首先通过从文件名中删除GUID,将基于GUID的文件名转换为原始文件名。然后使用FileContentResult类传输文件。您可以设置FileDownloadName属性以指定要传输的文件的文件名。事实上,FileDownloadName属性设置了Content-Disposition标题。

这是一个小代码示例(下载控制器类的操作方法):

string fileToDownload = "test.jpg_4274B9D4-9084-441C-9617-EAD03CC9F47F";

string originalFileName = fileToDownload.Substring(0, fileToDownload.LastIndexOf('_'));

FileContentResult result = new FileContentResult(
    System.IO.File.ReadAllBytes(Server.MapPath(String.Format("~/files/{0}", fileToDownload))), "application/binary");

result.FileDownloadName = originalFileName; // Sets the Content-Disposition header

return result;

提示下载文件的用户使用原始文件名打开/保存文件。

希望,这有帮助。