咱們在開發web系統時有時會有如下需求: web
要解決上述需求就可使用Content-disposition來解決。第一個需求的解決辦法是 瀏覽器
Response.AddHeader "content-disposition","attachment; filename=fname.ext"
public static void ToDownload(string serverfilpath,string filename) { FileStream fileStream = new FileStream(serverfilpath, FileMode.Open); long fileSize = fileStream.Length; HttpContext.Current.Response.ContentType = "application/octet-stream"; HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + UTF_FileName(filename) + "\";"); ////attachment --- 做爲附件下載 ////inline --- 在線打開 HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString()); byte[] fileBuffer = new byte[fileSize]; fileStream.Read(fileBuffer, 0, (int)fileSize); HttpContext.Current.Response.BinaryWrite(fileBuffer); fileStream.Close(); HttpContext.Current.Response.End(); } public static void ToOpen(string serverfilpath, string filename) { FileStream fileStream = new FileStream(serverfilpath, FileMode.Open); long fileSize = fileStream.Length; HttpContext.Current.Response.ContentType = "application/octet-stream"; HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=\"" + UTF_FileName(filename) + "\";"); HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString()); byte[] fileBuffer = new byte[fileSize]; fileStream.Read(fileBuffer, 0, (int)fileSize); HttpContext.Current.Response.BinaryWrite(fileBuffer); fileStream.Close(); HttpContext.Current.Response.End(); } private static string UTF_FileName(string filename) { return HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8); }
簡單的對上述代碼作一下解析,ToDownload方法爲將一個服務器上的文件(serverfilpath爲服務器上的物理地址),以某文件名 (filename)在瀏覽器上彈出「文件下載」對話框,而ToOpen是將服務器上的某文件以某文件名在瀏覽器中顯示/打開的。注意其中我使用了 UTF_FileName方法,該方法很簡單,主要爲了解決包含非英文/數字名稱的問題,好比說文件名爲「衣明志.doc」,使用該方法客戶端就不會出現 亂碼了。 安全
須要注意如下幾個問題: 服務器