Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 为上载文件创建唯一文件名/位置的策略_Asp.net Mvc_File Upload - Fatal编程技术网

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

Asp.net mvc 为上载文件创建唯一文件名/位置的策略,asp.net-mvc,file-upload,Asp.net Mvc,File Upload,我的ASP.NET MVC应用程序接受上载的文件并将其存储在单个文件夹中。但是,我想确保当用户上传文件时,应用程序接受任何文件名,但是当用户尝试上传具有相同文件名的文件时,这将失败 我想我可以为每个文件创建单独的文件夹,但我希望有一个干净、扁平的目录结构。目前,我在文件名中附加了一个GUID,但这不是一个好的解决方案,因为当用户下载文件时,它会导致奇怪的文件名。 我曾考虑将文件数据存储在数据库中,然后在请求时将其写入文件,但这会带来很大的开销 有其他方法吗?为了保持目录结构平坦,请通过附加GUI

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

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


有其他方法吗?

为了保持目录结构平坦,请通过附加GUID(正如您已经做的那样)来存储文件。在下载处理程序(控制器操作方法)中,首先通过从文件名中删除GUID将基于GUID的文件名转换为原始文件名。然后使用
FileContentResult
类传输文件。您可以设置
FileDownloadName
属性来指定要传输的文件的文件名。实际上,
FileDownloadName
属性在引擎盖下设置内容处置头

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

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

希望,这有帮助

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;