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/

相关文章:

memory - PHP 警告 : POST Content-Length of 113 bytes exceeds the limit of -1988100096 bytes in Unknown

c# - Linq 如何在所有值都等于 null 或 0 时获取平均值? MVC

asp.net-mvc - 将 ASP.NET 应用程序部署到多个 EC2 实例有哪些方法?

c# - 在表单中提交下拉列表的值和文本

asp.net - 为什么我无法解析 css 文件的客户端 url?

html - 如何从 IE 中的单个 HTML 表单上传多个文件?

angular - 如何获取图像并在我的页面中显示 angular 6

angularjs - 从 angularjs + flow.js 中的 Controller 动态传递 flow-init 目标的上传 URL

javascript - 使用剪贴板 API 粘贴图像 - CKEditor

c# - 使用获取的 Json 数据返回 Ajax 成功调用中的部分 View