今天在修改我博客的文件管理功能,尝试解决一直以来的一个问题。即IIS中没有注册MIME映射的文件类型,是无法直接用Http Get方式下载的,也就是不能点击超链接直接转向文件位置。比如7z压缩包,如果直接下载,会是这个样子:

后来我想到了以前Gridview输出Excel的方式,是通过Response传输字节流的。稍微查阅了一下,发现ASP.NET的Response对象现在有了一个新的方法:TransmitFile(),不过它在MSDN上的描述不是很详细。

具体做法是这样的:

Response.ContentType = "application/x-compress";
Response.AddHeader("Content-Disposition", string.Format("attachment;filename=要输出的文件名"));
Response.TransmitFile(文件在服务器上的绝对路径));
Response.End();

现在我的7z压缩包就可以使用Response方式下载了(尽管ContentType可能不太正确):

这种方法同样也可以用来输出App_Data等受保护文件夹中的文件。比如网站采用Access数据库,用户希望定期下载备份文件,就可以用Response.TransmitFile来做,不然ASP.NET默认是不让用户访问App_Data文件夹的。