【发布时间】:2011-04-05 23:54:34
【问题描述】:
有人向我建议我应该使用 FileResult 来允许用户从我的 Asp.Net MVC 应用程序下载文件。但我能找到的唯一例子总是与图像文件有关(指定内容类型图像/jpeg)。
但是如果我不知道文件类型怎么办?我希望用户能够从我网站的文件区域下载几乎任何文件。
我已经阅读了一种执行此操作的方法(有关代码,请参见 previous post),它实际上工作正常,除了一件事:“另存为”对话框中出现的文件名是从文件连接起来的带下划线的路径 (folder_folder_file.ext)。此外,似乎人们认为我应该返回一个 FileResult 而不是使用我找到的这个自定义类 BinaryContentResult。
有人知道在 MVC 中进行此类下载的“正确”方式吗?
编辑: 我得到了答案(如下),但我只是想如果其他人有兴趣,我应该发布完整的工作代码:
public ActionResult Download(string filePath, string fileName)
{
string fullName = Path.Combine(GetBaseDir(), filePath, fileName);
byte[] fileBytes = GetFile(fullName);
return File(
fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
byte[] GetFile(string s)
{
System.IO.FileStream fs = System.IO.File.OpenRead(s);
byte[] data = new byte[fs.Length];
int br = fs.Read(data, 0, data.Length);
if (br != fs.Length)
throw new System.IO.IOException(s);
return data;
}
【问题讨论】:
-
你在做的是相当危险的。您几乎允许用户从您的服务器下载执行用户可以访问的任何文件。
-
True - 删除文件路径,并将其固定在 actionresult 的主体中会更安全一些。至少这样他们只能访问某个文件夹。
-
是否有任何工具可以让您找到像这个这样的潜在危险漏洞?
-
我发现将content-type设置为
Response.ContentType = MimeMapping.GetMimeMapping(filePath);很方便,来自stackoverflow.com/a/22231074/4573839 -
你在客户端使用什么?
标签: c# asp.net-mvc-2