asp.net-mvc - 为上传的文件创建唯一文件名/位置的策略

标签 asp.net-mvc file-upload

我的 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/

相关文章:

asp.net-mvc - 在 IIS 7 中部署 Umbraco 7.2 后,Razor View 不生成 html

flutter - 上载图像抖动时如何显示小部件(加载20%,30%)

javascript - Node JS 和 Multer : stop uploading file if error occurs

PHP内存耗尽

c# - 在 Asp.net mvc 中维护 View 状态?

asp.net-mvc - System.Web.MVC 的位置,以便我可以用反射器反射它

asp.net-mvc - 如何首先使用EF核心代码制作连接表

c# - Html.ValidationMessageFor 文本颜色

jsf - JSF 2.0文件上传

javascript - 如何在 nativescript 中使用多部分表单数据上传文件?