为了防止非法用户直接输入文件地址下载,我把文件先读出来到输出流:
namespace FWeb.FWareHouse
{
    public partial class BackupDbDown : FPage//FPage从Page继承,包含身份验证
    {
        protected override void OnLoad(EventArgs e)
        {
            String fileName = Request.QueryString("FN").ToString();
            fileName = Server.MapPath(fileName);
            FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read);
         
            Response.ClearHeaders();
            Response.ContentType = "application/x-msdownload";
            Response.AddHeader("Content-Disposition", "attachment;filename= " + System.IO.Path.GetFileName(fileName));
            byte[] buffer = new byte[4096]; //担心一次读入大文件占内存,所以一块一块的读入。
            while (true)
            {
                int b = f.Read(buffer, 0, buffer.Length);
                if (b == 0) break;
                Response.BinaryWrite(buffer);
            }
            f.Close();
            Response.Flush();
            Response.Close();
        }
    }
}下面有以下问题:
1.在点击链接打开下载对话框以后,IE提示文件大小为未知,怎么样才能让IE显示文件大小?是不是要在标头里设置什么?
2.用网际快车下载时,下载了一个登录页面,我汗,没通过验证。右击另存或直接点击下载却可以。怎么办?
3.像这样的流输出下载,如果下载很大的文件,会不会产生脚本超时错误?

解决方案 »

  1.   

    问题1: 尝试设置 response的Content-Length
    问题2: 页面不要用session或cookie而是用URL的参数验证权限,例如对 “某个内容”+“时间等”进行MD5作为验证
    问题3: 不会超时,但你需要在文件流的中间多次Response.Flush(),而不是只在最后做一次。
      

  2.   

    文件大小是需要自己加的 Response.AddHeader("Content-Length", 你的文件大小);
      

  3.   

    下面的能显大小了 帮你做了小修改  个人觉得比较好 别介意哦
    protected override void OnLoad(EventArgs e)
    {
    string fileName= Request.QueryString("FN").ToString();
    fileName = Server.MapPath(fileName);
    FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read);
             
    Response.ClearHeaders();
    Response.ContentType = "application/x-msdownload";
    Response.AddHeader("Content-Disposition", "attachment;filename= " + System.IO.Path.GetFileName(fileName));
    byte[] buffer = new byte[4096]; 
    long len=0;
    int b = f.Read(buffer, 0, buffer.Length);
    while (b>0)
    {
    Response.BinaryWrite(buffer);
    len+=b;
    b = f.Read(buffer, 0, buffer.Length);
    }
    f.Close();
    Response.AddHeader("Content-Length",len.ToString());
    Response.Flush();
    Response.Close();
    }