【发布时间】:2011-02-08 08:57:28
【问题描述】:
我有一个 Action 需要从安全位置读取文件,所以我必须使用模拟来读取文件。
此代码有效:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult DirectDownload(Guid id)
{
if (Impersonator.ImpersonateValidUser())
{
try
{
var path = "path to file";
if (!System.IO.File.Exists(path))
{
return View("filenotfound");
}
var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "application/octet-stream", "FileName");
}
catch (Exception e)
{
Log.Exception(e);
}finally
{
Impersonator.UndoImpersonation();
}
}
return View("filenotfound");
}
上述代码的唯一问题是我必须将整个文件读入内存,而且我要处理非常大的文件,所以这不是一个好的解决方案。但是如果我替换这两行:
var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "application/octet-stream", "FileName");
用这个:
return File(path, "application/octet-stream", "FileName");
它不起作用,我收到错误消息:
访问路径 'c:\projects\uploads\1\aa2bcbe7-ea99-499d-add8-c1fdac561b0e\Untitled 2.csv' 被拒绝。
我猜想使用带有路径的文件结果,稍后在我已经“撤消”模拟时尝试在请求管道中打开文件。
请记住,模拟代码有效,因为我可以读取字节数组中的文件。我想做的是将文件流式传输到客户端。
知道如何解决这个问题吗?
提前致谢。
【问题讨论】:
标签: asp.net-mvc security impersonation