我有一個操作,需要從安全位置讀取文件,所以我必須使用模擬來讀取文件。模仿在ASP.NET MVC
此代碼:
[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'被拒絕。
我想用一個路徑的文件結果嘗試在請求管道中稍後打開文件,當我已經「取消」模擬。
請記住,模擬代碼的工作原理是因爲我可以讀取bytes數組中的文件。我想要做的是將文件流式傳輸到客戶端。
任何想法如何解決這個問題?
在此先感謝。
這很好。我改變了一點,因爲我得到一個異常... Impersonator.ImpersonateValidUser(); response.WriteFile(文件名); response.Flush(); response.End(); Impersonator.UndoImpersonation(); – Emad 2010-04-16 18:44:29
是的,這是一個好的開始。但是,它會在特定版本的IIS中引發「無效句柄」錯誤,這些版本是基於提供文件(而不是基於模仿)而建立的。 – Greg 2015-05-21 13:52:52