如果文件共享是通過你的應用程序池下(網絡服務默認情況下)運行,您可以完全刪除虛擬目錄,並創建一個ASP.NET應用程序,將文件流式傳輸到瀏覽器的用戶讀取。如果你使用MVC,它只是返回一個文件結果。這有一個額外的好處,你將能夠限制用戶下載文件。即您可以要求用戶登錄或具有下載文件的特定權限。另外請確保您測試路徑遍歷,您不希望用戶輸入../../filename來下載他們不被允許的文件。
選項1:ASP.NET MVC
public ActionResult Download(string file)
{
// Check for directory traversal attack
if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1)
{
return new HttpNotFoundResult();
}
file = System.IO.Path.Combine("\\FILE_SHARE_FOLDER\\", file);
if(!System.IO.File.Exists(file))
{
return new HttpNotFoundResult();
}
return this.File(file, GetMimeType(file));
}
選項2:Web表單
private void DownloadFile(string file)
{
// Check for directory traversal attack
if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1)
{
Response.StatusCode = 404;
Response.End();
}
file = System.IO.Path.Combine("\\FILE_SHARE_FOLDER\\", file);
if (!System.IO.File.Exists(file))
{
Response.StatusCode = 404;
Response.End();
}
Response.ContentType = GetMimeType(file);
Response.TransmitFile(file);
}
注意您將需要一個方法來獲得MIME類型都MVC和Webforms(MIME Type Method From KodeSharp)
private string GetMimeType(string fileName)
{
string mimeType = "application/unknown";
string ext = System.IO.Path.GetExtension(fileName).ToLower();
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (regKey != null && regKey.GetValue("Content Type") != null)
mimeType = regKey.GetValue("Content Type").ToString();
return mimeType;
}
.net被設置爲根應用程序上的通配符處理程序,因此我必須在代碼中構建某種過濾器,但我想它可以工作。不幸的是,他們將不得不編輯/刪除對web.config選項的訪問。 – Zarigani
@Zarigani我有類型的第一個解決方案將完成這項工作。 – Aristos