.NET强制下载文件的集中方法(转)
文件下载
一. 服务端通过Response输出相应的HTTP Response Headers信息,和要下载的文件的数据来把文件发送到客户端,HTTP Response Headers表现在html文件中是下面的形式:
<meta http-equiv="Content-Type" content="text/htm ">
http-equiv表示是Headers的名称,content表示这个Headers的值
<meta http-equiv="Content-Type" content="text/htm ">
http-equiv表示是Headers的名称,content表示这个Headers的值
二. 首先,要输出文件的MIME类型:
Page.Response.AddHeader( "Content-Type", “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 ―― 表示发送到客户端文件的文件名。
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数组:
1
string FileName; //生成或获取要发送到客户端的文件名
2
string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下
3
if(File.Exists(filePath) == false)
4
{
5
//服务器上没有这个文件
6
return;
7
}
8
FileStream myFile = File.OpenRead(filePath); //读取文件进入FileStream
9
byte[] fileCont = new byte[myFile.Length];
10
myFile.Read(fileCont,0,(int)myFile.Length); //将文件流中的内容转成byte数组
string FileName; //生成或获取要发送到客户端的文件名2
string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下3
if(File.Exists(filePath) == false)4
{5
//服务器上没有这个文件6
return;7
}8
FileStream myFile = File.OpenRead(filePath); //读取文件进入FileStream9
byte[] fileCont = new byte[myFile.Length];10
myFile.Read(fileCont,0,(int)myFile.Length); //将文件流中的内容转成byte数组 1
//从url获取图片的id
2
string ImageId = Request.QueryString["img"];
3
//构建查询语句
4
string sqlText = "SELECT img_data, img_contenttype FROM Image WHERE img_pk = " + ImageId;
5
SqlConnection connection = new SqlConnection( ConfigurationSettings.AppSettings["DSN"].ToString() );
6
SqlCommand command = new SqlCommand( sqlText, connection);
7
connection.Open();
8
SqlDataReader dr = command.ExecuteReader();
9
if ( dr.Read())
10
{
11
byte[] fileCont = (byte[]) dr["img_data"] ;
12
}
13
connection.Close();
//从url获取图片的id2
string ImageId = Request.QueryString["img"];3
//构建查询语句4
string sqlText = "SELECT img_data, img_contenttype FROM Image WHERE img_pk = " + ImageId;5
SqlConnection connection = new SqlConnection( ConfigurationSettings.AppSettings["DSN"].ToString() );6
SqlCommand command = new SqlCommand( sqlText, connection);7
connection.Open();8
SqlDataReader dr = command.ExecuteReader();9
if ( dr.Read())10
{11
byte[] fileCont = (byte[]) dr["img_data"] ;12
}13
connection.Close();1
HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create( "http://www.via.com/aa.xls ");
2
HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();
3
Stream readStream = myWebResponse.GetResponseStream();
4
5
byte[] bytes = new byte[readStream.Length];
6
bytes = readStream.Read(bytes,0,readStream.Length);
HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create( "http://www.via.com/aa.xls ");2
HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();3
Stream readStream = myWebResponse.GetResponseStream();4
5
byte[] bytes = new byte[readStream.Length];6
bytes = readStream.Read(bytes,0,readStream.Length);通过上述三种方法获得的文件内容的byte数组就可以用来输出了:
Page.Response.BinaryWrite(fileCont);
Page.Response.BinaryWrite(fileCont);
Page.Response.End()
2. 直接读取文件输出:
2. 直接读取文件输出:
1
string FileName; //生成或获取要发送到客户端的文件名
2
string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下
3
if(File.Exists(filePath) == false)
4
{
5
//服务器上没有这个文件
6
return;
7
}
8
Page.Response.Clear();
9
Page.Response.AddHeader( "Content-Type", "image/gif" ); //根据MIME的不同设置
10
Page.Response.AddHeader("Content-Disposition", "inline;filename=" + filePath);
11
Page.Response.WriteFile(filePath);
12
Page.Response.End();
string FileName; //生成或获取要发送到客户端的文件名2
string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下3
if(File.Exists(filePath) == false)4
{5
//服务器上没有这个文件6
return;7
}8
Page.Response.Clear();9
Page.Response.AddHeader( "Content-Type", "image/gif" ); //根据MIME的不同设置10
Page.Response.AddHeader("Content-Disposition", "inline;filename=" + filePath);11
Page.Response.WriteFile(filePath);12
Page.Response.End();


浙公网安备 33010602011771号