.NET强制下载文件的集中方法(转)

文件下载
一.     服务端通过Response输出相应的HTTP Response Headers信息,和要下载的文件的数据来把文件发送到客户端,HTTP Response Headers表现在html文件中是下面的形式:
<meta http-equiv="Content-Type" content="text/htm ">
http-equiv
表示是Headers的名称,content表示这个Headers的值
二.     首先,要输出文件的MIME类型:
Page.Response.AddHeader( "Content-Type", “MIME类型” );
三.     其次,要输出下载的文件的打开位置和文件名:
Page.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName );
content-disposition
的 HTTP response header 允许指定文档表示的信息。使用这种 header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。
打开位置:
attachment ―― 表示作为附件发送到客户端,客户端将单独打开此文件。
inline ―― 表示将在浏览器中打开这个文件。
文件名:
filename ―― 表示发送到客户端文件的文件名。
四.     准备发送到客户端的文件数据:
1.       先将不同类型来源的数据转成byte类型的数组,再通过Response.BinaryWrite方法发送到客户端:

1.1.      读取文件来获得byte数组:


 1string FileName; //生成或获取要发送到客户端的文件名
 2string filePath = Server.MapPath("./"+ FileName; //假设文件在当前目录下
 3if(File.Exists(filePath) == false)
 4{
 5       //服务器上没有这个文件
 6        return;
 7}

 8FileStream myFile = File.OpenRead(filePath); //读取文件进入FileStream
 9byte[] fileCont = new byte[myFile.Length];
10myFile.Read(fileCont,0,(int)myFile.Length);   //将文件流中的内容转成byte数组
1.2.      在数据库的二进制字段中读取:
 1//从url获取图片的id
 2string ImageId = Request.QueryString["img"];
 3//构建查询语句
 4string sqlText = "SELECT img_data, img_contenttype FROM Image WHERE img_pk = " + ImageId;
 5SqlConnection connection = new SqlConnection( ConfigurationSettings.AppSettings["DSN"].ToString() );
 6SqlCommand command = new SqlCommand( sqlText, connection);
 7connection.Open();
 8SqlDataReader dr = command.ExecuteReader();
 9if ( dr.Read())
10{
11        byte[] fileCont = (byte[]) dr["img_data"] ;
12}

13connection.Close();

1.3.      从internet上读取文件:
1HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create( "http://www.via.com/aa.xls ");
2HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();
3Stream readStream = myWebResponse.GetResponseStream();
4                     
5byte[] bytes = new byte[readStream.Length];
6bytes = readStream.Read(bytes,0,readStream.Length);
通过上述三种方法获得的文件内容的byte数组就可以用来输出了:
Page.Response.BinaryWrite(fileCont);
Page.Response.End()
2.       直接读取文件输出:
 1string FileName; //生成或获取要发送到客户端的文件名
 2string filePath = Server.MapPath("./"+ FileName; //假设文件在当前目录下
 3if(File.Exists(filePath) == false)
 4{
 5       //服务器上没有这个文件
 6        return;
 7}

 8Page.Response.Clear();
 9Page.Response.AddHeader( "Content-Type""image/gif" ); //根据MIME的不同设置
10Page.Response.AddHeader("Content-Disposition""inline;filename=" + filePath);
11Page.Response.WriteFile(filePath);
12Page.Response.End();
posted on 2007-09-12 22:13  何力冠  阅读(625)  评论(0)    收藏  举报