应用场景,很多时候都有盗链等各种各样的原因,用ASP.NET呢,最基本的一个问题,我的所有数据文件都保存在App_Data,这个文件夹和配置文件Web.Config一样,直接是无法访问其中内容的,所以如果里面上传了文件,无论是图片,还是压缩包,想下载就要通过某个点Response.WriteFile出去,不过在讨论的时候又发现了一些新的内容,如下:
首先,是下载的基础,Http Header 的做两个设置:
只要对上述的两个设置项进行设置以后就可以正常输出问题了,还需要服务器段的代码,以下我列出了三个实现,第一个是最简单的原型,然后再它的基础上有一个备选,最后一个是一个来自MSDN的高级解决方案,没研究明白到底是否该用~
最简单的实现:
新建一个WebForm页面,然后在Page_load里面添加内容:
protected void Page_Load(object sender, EventArgs e){if (null != Request.QueryString["key"]){string path = Request.PhysicalApplicationPath + @"App_Data\"代码如上所示很简单,但是注释部分,我搞了小半个小时~感觉最近手艺有点潮。
+ Request.QueryString["key"].Replace(''/'', Path.DirectorySeparatorChar);if (File.Exists(path)){FileInfo fi = new FileInfo(path);Response.Clear();Response.ContentType = "application/octet-stream";// 注意!这个地方一定要用AppendHeader。MSDN上很多地方指导使用// Response.Headers.Add 或 Response.AddHeader// 但是在MSDN中明确写出,这些都是为了兼容ASP,在.NET 3.5要求使用下面这种方式。// 如果使用了上述两种方式可能会产生“此操作要求使用 IIS 集成管线模式。 ”的异常。Response.AppendHeader("Content-Disposition", string.Format
("attachment;filename=\"{0}\"",HttpUtility
.UrlEncode(fi.Name, System.Text.Encoding.UTF8)));Response.AppendHeader("Content-Length", fi.Length.ToString());Response.WriteFile(fi.FullName);}elseResponse.Write(string.Format("access is error.{0} is no exist.", path));}else{Response.Write("i need key!");}}