none
帮忙改进下载的代码 RRS feed

  • 问题

  • 这段代码虽然能实现下载功能,前提是下载的文件很小,几十兆的文件就会等好几分钟。

    请高手们帮忙改进一下代码,点击下载时,可以几秒钟后让下载工具(迅雷等)补捉到文件的路径。

    最好是不需要另外打开一个空白的页面。下载的文件格式都是rar,ZIP的压缩文件格式
    //清空输出流
    
             Response.Clear();
    
            Response.Charset = "utf-8";
    
            Response.Buffer = true;
    
            //关闭ViewSate以提高速度
    
             this.EnableViewState = false;
    
            //定义输出文件编码、类型和文件名
    
             Response.ContentEncoding = System.Text.Encoding.UTF8;<br />        //saveFileName是文件名
    
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlPathEncode( saveFileName));
    
            //保存文件类型不限,此处类型选择"unkonwn"
    
            Response.ContentType = "application/unknown";<br />        //Selectfile是路径+文件名
    
            Response.WriteFile(Selectfile);
    
            Response.Redirect(Selectfile);
    
            //清空并关闭输出流
    
             Response.Flush();
    
            Response.Close();
    
            Response.End();        
    
    
    2009年10月13日 14:33

答案

  • 可以采用这种方法 length = iStream.Read(buffer, 0, 10000);参见 http://support.microsoft.com/kb/812406/zh-cn
    【孟子E章】
    • 已标记为答案 斌斌NO1 2009年10月14日 12:02
    2009年10月14日 0:40
    版主
  • 按微软提供的方法改进了,但是运行的时报异常,说找不到需要下载的文件路径
     //下载代码
             System.IO.Stream iStream = null;
            byte[] buffer = new Byte[10000];
            int length;
            long dataToRead;
            //Selectfile是路径+文件名 Selectfile="SoftSKin/" + 文件名
            string filename = System.IO.Path.GetFileName(Selectfile);
    
            try
            {
                //通过断点发现,iStream =null后,就跳到了catch 里面了。
                  iStream = new System.IO.FileStream(Selectfile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
                dataToRead = iStream.Length;
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
                while (dataToRead > 0)
                {
                    if (Response.IsClientConnected)
                    {
                        length = iStream.Read(buffer, 0, 10000);
                        Response.OutputStream.Write(buffer, 0, length);
                        Response.Flush();
    
                        buffer = new Byte[10000];
                        dataToRead = dataToRead - length;
                    }
                    else
                    {
                        dataToRead = -1;
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write("文件下载时出现错误!");
            }
            finally
            {
                if (iStream != null)
                {
                    iStream.Close();
                }
            }
    
     异常提示:未能找到路径“C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\SoftSKin\20099271519测试文件.rar”的一部分。
     在二进制数据流输出方式中路径(Selectfile是路径+文件名:Selectfile="SoftSKin/" + 文件名)也是这么写的,可以实现下载,怎么在这儿就找不到路径了?
    显然你的写法有问题。Selectfile必须是绝对路径,Selectfile = Server.MapPath("~/SoftSKin/" + 文件名)
    文件需要放在网站跟文件夹 SoftSKin下即可
    • 已标记为答案 斌斌NO1 2009年10月14日 12:02
    2009年10月14日 6:03
    版主

全部回复

  • 可以采用这种方法 length = iStream.Read(buffer, 0, 10000);参见 http://support.microsoft.com/kb/812406/zh-cn
    【孟子E章】
    • 已标记为答案 斌斌NO1 2009年10月14日 12:02
    2009年10月14日 0:40
    版主
  • 按微软提供的方法改进了,但是运行的时报异常,说找不到需要下载的文件路径
     //下载代码
             System.IO.Stream iStream = null;
            byte[] buffer = new Byte[10000];
            int length;
            long dataToRead;
            //Selectfile是路径+文件名 Selectfile="SoftSKin/" + 文件名
            string filename = System.IO.Path.GetFileName(Selectfile);
    
            try
            {
                //通过断点发现,iStream =null后,就跳到了catch 里面了。
                  iStream = new System.IO.FileStream(Selectfile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
                dataToRead = iStream.Length;
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
                while (dataToRead > 0)
                {
                    if (Response.IsClientConnected)
                    {
                        length = iStream.Read(buffer, 0, 10000);
                        Response.OutputStream.Write(buffer, 0, length);
                        Response.Flush();
    
                        buffer = new Byte[10000];
                        dataToRead = dataToRead - length;
                    }
                    else
                    {
                        dataToRead = -1;
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write("文件下载时出现错误!");
            }
            finally
            {
                if (iStream != null)
                {
                    iStream.Close();
                }
            }
     异常提示:未能找到路径“C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\SoftSKin\20099271519测试文件.rar”的一部分。
     在二进制数据流输出方式中路径(Selectfile是路径+文件名:Selectfile="SoftSKin/" + 文件名)也是这么写的,可以实现下载,怎么在这儿就找不到路径了?
    • 已标记为答案 斌斌NO1 2009年10月14日 12:01
    • 取消答案标记 斌斌NO1 2009年10月14日 12:02
    2009年10月14日 3:35
  • 按微软提供的方法改进了,但是运行的时报异常,说找不到需要下载的文件路径
     //下载代码
             System.IO.Stream iStream = null;
            byte[] buffer = new Byte[10000];
            int length;
            long dataToRead;
            //Selectfile是路径+文件名 Selectfile="SoftSKin/" + 文件名
            string filename = System.IO.Path.GetFileName(Selectfile);
    
            try
            {
                //通过断点发现,iStream =null后,就跳到了catch 里面了。
                  iStream = new System.IO.FileStream(Selectfile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
                dataToRead = iStream.Length;
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
                while (dataToRead > 0)
                {
                    if (Response.IsClientConnected)
                    {
                        length = iStream.Read(buffer, 0, 10000);
                        Response.OutputStream.Write(buffer, 0, length);
                        Response.Flush();
    
                        buffer = new Byte[10000];
                        dataToRead = dataToRead - length;
                    }
                    else
                    {
                        dataToRead = -1;
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write("文件下载时出现错误!");
            }
            finally
            {
                if (iStream != null)
                {
                    iStream.Close();
                }
            }
    
     异常提示:未能找到路径“C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\SoftSKin\20099271519测试文件.rar”的一部分。
     在二进制数据流输出方式中路径(Selectfile是路径+文件名:Selectfile="SoftSKin/" + 文件名)也是这么写的,可以实现下载,怎么在这儿就找不到路径了?
    显然你的写法有问题。Selectfile必须是绝对路径,Selectfile = Server.MapPath("~/SoftSKin/" + 文件名)
    文件需要放在网站跟文件夹 SoftSKin下即可
    • 已标记为答案 斌斌NO1 2009年10月14日 12:02
    2009年10月14日 6:03
    版主
  • 己在网上找到了解决的方法,谢谢老师热心解答!!!
    2009年10月14日 12:01