学习下载文件

例子   tranmitfile下载

      FileInfo ubf = new FileInfo(this.url.Value);
        Response.Clear();//清楚下载文件之前的response内容,以免写入多余response,导致下载文件出错
        Response.ClearHeaders();//清楚下载前头文件,以免冲突出错
        Response.Buffer = false;//  不缓冲,边解析边发送

        Response.ContentType = "text/plain";//制定下载的文件格式
        Response.ContentEncoding = System.Text.Encoding.Default;//制定下载的文件的格式编码
        Response.AppendHeader("content-length", ubf.Length.ToString());//制定文件长度(不指定也可),Response.Buffer = false;下不能自动获取文件总大小,需先指定大小,作为下载时候的一种文件大小用户提示。
        Response.AppendHeader("content-disposition", "attachment;filename=" + "ddd.txt");//内容配置,以附件下载(inline在线打开),并下载文件名
        Response.TransmitFile(this.url.Value);//此种方式不写入缓冲区,指定的文件直接写入 HTTP 响应输出流       

        Response.Flush();//将缓冲区中编译完成的数据先发送到客户端
        Response.End();

例子 流下载

 Response.Clear();//清楚下载文件之前的response内容,以免写入多余response,导致下载文件出错
        Response.ClearHeaders();//清楚下载前头文件,以免冲突出错
        Response.Buffer = false;
        FileStream downfile = new FileStream(this.url.Value.Trim(), FileMode.Open, FileAccess.Read);//创建文件流,并指定文件权限
        byte[] data = new byte[downfile.Length];//大文件字节数组会溢出,导致出错
        downfile.Read(data, 0, data.Length);//将文件写如字节数组(流)
        downfile.Close();
        Response.ContentType = "application/octet-stream";//制定下载的文件格式
        Response.ContentEncoding = System.Text.Encoding.Default;//制定下载的文件的格式编码
        Response.AppendHeader("content-disposition", "attachment;filename=" + "ddd.txt");//内容配置,以附件下载,并下载文件名
        Response.BinaryWrite(data);
        Response.Flush();
        Response.End();

例子  

Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.Charset = "utf-8";
Response.Write("千一网络");
然后用浏览器打开网页,可以发现是乱码,可是用记事本查看源文件,又发现不是乱码。这就说明了:

ContentEncoding 是管字节流到文本的,而 Charset 是管在浏览器中显示的。

 

例一

protected void btnResponseWord_Click(object sender, EventArgs e)
    {
        Response.Clear(); //清空无关信息
        Response.Buffer= true; //完成整个响应后再发送
        Response.Charset = "GB2312";//设置输出流的字符集-中文
  Response.AppendHeader("Content-Disposition","attachment;filename=Report.doc");//追加头信息
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流的字符集
        Response.ContentType = "application/ms-word ";//输出流的MIME类型
        Response.Write(TextBox1.Text);
        Response.End();//停止输出
    }

为何使用clear():

并非必须的 ,倘若你在调用   Response.WriteFile(pictureFilename);   之前还向缓冲区中写入过数据例如调用过:Response.Write("abc"); 并且你还希望浏览器能够将这个图片正常的显示,这时你就需要Response.Clear();了  如果不Response.Clear();那么图片将可能无法正常的显示,为什么呢?  原因是这样的,首先你想要告诉客户端这个响应内容的类型为image/jpeg   你是通过Response.AppendHeader("content-type", "image/jpeg"); 申明的。  然后能当客户端得到这个响应数据时也将会将这些数据按照image/jpeg   来解释,但是由于你前面掉用了Response.Write("abc"); 因此客户端实际上得到的内容为 <字符:abc>+<图片的数据> 这样客户端得到的数据实际上不仅仅是图片的数据但是由于你声明的“content-type”强调了这些数据应该按照image/jpeg来解释 最终导致的结果就是图片不能正常的解码 所以在Response.WriteFile(pictureFilename);   之前先调用Response.Clear();较为保险


例子三

 

                FileInfo DownloadFile = new FileInfo(url);
                Response.Clear();
                Response.ClearHeaders();
                Response.Buffer = false;
                Response.Charset = "utf-8";
                Response.ContentEncoding = System.Text.Encoding.UTF8;
                Response.ContentType = "application/octet-stream ";

                string agent = Request.UserAgent;
                string desvalue = string.Empty;
                if (agent != null && agent.IndexOf("MSIE", StringComparison.CurrentCultureIgnoreCase) == -1)
                {
                    desvalue += "attachment;filename*=utf8''";
                }
                else {
                    desvalue = "attachment;filename=";
                }
                Response.AppendHeader("Content-Disposition",
                   desvalue+Server.UrlEncode(BookService.GetEntity(this.downpath.Value).Name + DownloadFile.Extension)      );
                Response.AppendHeader("Content-Length ", DownloadFile.Length.ToString());
                Response.Flush();
                Response.TransmitFile(DownloadFile.FullName);
                Response.Flush();
                Response.End();


Response.flush()。很多时候我们写的asp程序会因为做很多操作,所以会花上一分钟甚至几分钟时间。为了使软件使用者能够耐心的等待程序的执行,我们经常会希望有一个进度条来表示程序执行的状态。或者最起码要显示一个类似: “数据载入中”,“正在保存数据” 等的说明性文字。此时我们就会用到Response.flush()。他会将缓冲区中编译完成的数据先发送到客户端。

 

即当Buffer为True的时候,asp会将这个程序解释完毕后一起发送到客户端,
当Buffer为False的时候,asp会边解析边发送数据.

<% Response.Buffer = True %>这句话的意思就是指明输出页面是否被缓冲,当属性值为True时,服务器将不会向客户端发送任何信息,直到所有程序执行完或者遇到<% Response.Flush %>或<% Response.End %>语句,才会释放缓冲区的信息。

下面的这个代码演示了Buffer的这一特性
<%   
Response.Charset = "gb2312"  
Response.Buffer = "False"  
Dim str256  
str256 = "1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz"  
Response.Write("开始<br>")  
For i = 1 to 100  
    For u = 1 to 1000000  
    Next  
    Response.Write(str256 & "    ")  
    Response.Write(i & "<br>")  
Next  
Response.Write("结束")  
%>  
<% Response.Charset = "gb2312" Response.Buffer = "False" Dim str256 str256 = "1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz" Response.Write("开始<br>") For i = 1 to 100 For u = 1 to 1000000 Next Response.Write(str256 & " ") Response.Write(i & "<br>") Next Response.Write("结束") %>
如果将Response.Buffer = "False"改为Response.Buffer = "True"则会解析完毕再输出,即输出一个含有1到100的数字的网页

 

 

Response.TransmitFile(filename);
TransmitFile MSDN解释,将文件直接输入HTTP 输出流,不进行缓存
也就意味着,文件直接传送到客户端,而不是先缓存好整个文件 传送到客户端
因此如果文件过大,就会导致放松请求,以保持文件的下载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值