[讨论]Response.ContentType 控制输出文件类型(讨论下载文件问题)

Response.ContentType :控制输出的文件类型
<script language="JavaScript" src="../flashtop/ViewFileScript.js" type="text/javascript"> </script>
服务器送给客户端的数据包类型可以是text/html文本,也可以是gif/jpeg图形文件,所以每次传输前,我们都必须告知客户端将要传输的文件类型,一般默认情况下为“Text/Html”类型。
<% Response.ContentType = "text/HTML" %>
<% Response.ContentType = "image/GIF" %>
<% Response.ContentType = "image/JPEG" %>
<% Response.ContentType = "text/plain" %>
<% Response.ContentType = "image/JPEG" %>
<% Response.ContentType = "application/x-cdf" %>
用于作为文本内容返回而不是已解释的 HTML 语句
Response.ContentType = "text/plain"



<% 
Response.ContentType = "text/plain" 
Response.write(now()&"会被执行么?")
%>


你可以注意到:页面提供下载,页面中的ASP内容被解释执行了的

程序文件以XLS文件被提供下载
Response.ContentType = "application/vnd.ms-excel"



<%
Response.ContentType = "application/vnd.ms-excel"
Response.write("本页面调试会出现下载对话框提供下载,保存类型为XLS")
%>



实现歌曲连续播放
response.ContentType="audio/x-pn-realaudio" 



<%
dim ramstr 
ramstr="" 
set rs=server.createobject("adodb.recordset") 
sql="XXXXXXXXXXX" 
rs.open sql,conn,1,3 'conn已定义 
do while not rs.eof 
ramstr=ramstr&rs("url")&vbCrLf 
rs.movenext 
loop 
rs.close 
response.ContentType="audio/x-pn-realaudio" 
'response.ContentType="audio/x-mpegurl" 
response.write ramstr 
%>



response.write 输出的时候,由于定义了response.ContentType 所以输出歌曲地址的时候会自动调用符合相应格式的软件来播放歌曲,不过前提是播放歌曲的软件必须先安装的。

以上文章转贴自http://www.w269.com/infow269/1145w2691.htm
这里我想讨论一下,这么也东东。

Q:如何利用ContentType 来,在服务器上提供一个.xls后缀的文件点击下载而不是直接在浏览器中打开。(注意:于上程序文件以XLS文件被提供下载有所不同)

Response.ContentType = "application/x-download",让整个程序文件点击下载了。怎么办好呢???

A:解决方案1. 利用Response.WriteFile的文件输出操作
具体在按钮点击事件中添加一下代码

private void btnDownload_Click(object sender,System.EventArgs e)  

{   

string DownloadFileName=Server.MapPath"file.xls"); 

string filepath = DownloadFileName;   // Identify the file name.   

string filename = System.IO.Path.GetFileName(filepath);   

Response.Clear();   // Specify the Type of the downloadable file.   

Response.ContentType = "application/octet-stream";   // Set the Default file name in the FileDownload dialog box.   

Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);   

Response.Flush();   // Download the file.   

Response.WriteFile(filepath); 

Response.End();//没有这句,有时会出问题。会将该页面刷新后的内容追加写入filename文件中。  }

以上代码也适合用于小于100MB的小文件下载
如果是大于100MB的大文件下载可以用Response.FileStream

C#代码如下:(将 DownloadFileName 替换为大于 100 MB 的文件的名称。)

System.IO.Stream iStream = null;

// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10000];

// Length of the file:
int length;

// Total bytes to read:
long dataToRead;

// Identify the file to download including its path.
string filepath  = "DownloadFileName";

// Identify the file name.
string  filename  = System.IO.Path.GetFileName(filepath);

try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read,System.IO.FileShare.Read);//用文件流来处理


// Total bytes to read:
dataToRead = iStream.Length;

Response.ContentType = "application/octet-stream";//问题就在这里,解决百M关口
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);

// Read the bytes.
  while (dataToRead > 0)
{
// Verify that the client is connected.
if (Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10000);

// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);

// Flush the data to the HTML output.
Response.Flush();

buffer= new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
//Close the file.
iStream.Close();
}
}
 
参考:PRB:Response.WriteFile 无法下载大文件
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;812406#2

写text文件的代码如下:
  

private void btnDownload_Click(object sender,System.EventArgs e)  

{   

string DownloadFileName=Server.MapPath"file.xls"); 

string filepath = DownloadFileName;   // Identify the file name.   

string filename = System.IO.Path.GetFileName(filepath);   

Response.Clear();   // Specify the Type of the downloadable file.   

Response.ContentType = "application/octet-stream";   // Set the Default file name in the FileDownload dialog box.   

Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);   

Response.Flush();   // Download the file.   

Response.WriteFile(filepath); 

Response.End();//没有这句,有时会出问题。会将该页面刷新后的内容追加写入filename文件中。  }

以上代码也适合用于小于100MB的小文件下载
如果是大于100MB的大文件下载可以用Response.FileStream

C#代码如下:(将 DownloadFileName 替换为大于 100 MB 的文件的名称。)

System.IO.Stream iStream = null;

// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10000];

// Length of the file:
int length;

// Total bytes to read:
long dataToRead;

// Identify the file to download including its path.
string filepath  = "DownloadFileName";

// Identify the file name.
string  filename  = System.IO.Path.GetFileName(filepath);

try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read,System.IO.FileShare.Read);//用文件流来处理


// Total bytes to read:
dataToRead = iStream.Length;

Response.ContentType = "application/octet-stream";//问题就在这里,解决百M关口
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);

// Read the bytes.
  while (dataToRead > 0)
{
// Verify that the client is connected.
if (Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10000);

// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);

// Flush the data to the HTML output.
Response.Flush();

buffer= new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
//Close the file.
iStream.Close();
}
}
 
参考:PRB:Response.WriteFile 无法下载大文件
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;812406#2

写text文件的代码如下:
  

 private void Create_TextFile()
  {
   FileStream fs=new FileStream( Server.MapPath("note.txt"),FileMode.Create,FileAccess.Write);
   StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.GetEncoding("shift_jis"));
   sw.Flush();
   sw.BaseStream.Seek( 0,SeekOrigin.Begin );

   DataTable dt=BindGrid().Tables["vP_Prt"];
   foreach (DataRow row in dt.Rows)
   {
    foreach(DataColumn column in dt.Columns)
     sw.Write(row[column].ToString() + ",");
    sw.WriteLine();
   }
   
   sw.Flush( );
   sw.Close( );
  }



另外,如果没有设置好,.net是无法对服务器端的文件进行写操作的。
设置如下:
1,首先,该服务器端的文件要可写。至少某个角色要能写。
2,在IIS中的属性卡中的匿名登陆中,指定一个具有对那个文件进行写操作权限的角色,这样.net才能拥有相应的权限。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值