我的 ASP.NET MVC 应用程序接受上传的文件并将它们存储在单个文件夹中。但是,我想确保当用户上传文件时应用程序接受任何文件名,但是当用户尝试上传具有相同文件名的文件时,这将失败。
我想我可以为每个文件创建单独的文件夹,但我想要一个干净且扁平的目录结构。目前,我将 GUID 附加到文件名,但这不是一个好的解决方案,因为当用户下载文件时它会导致奇怪的文件名。 我想过将文件数据存储在数据库中,然后在请求时将其写入文件,但这是很大的开销。
还有其他方法吗?
最佳答案
为了保持目录结构平坦,通过附加 GUID 来存储文件(就像您已经做的那样)。在下载处理程序( Controller 操作方法)中,首先通过从文件名中删除 GUID,将基于 GUID 的文件名转换为原始文件名。然后使用 FileContentResult
类传输文件。您可以设置 FileDownloadName
属性来指定要传输的文件的文件名。事实上,FileDownloadName
属性在底层设置了 Content-Disposition header 。
这是一个小代码示例(下载 Controller 类的操作方法):
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;
下载文件的用户会被提示以原始文件名打开/保存文件。
希望这会有所帮助。
关于asp.net-mvc - 为上传的文件创建唯一文件名/位置的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7414617/