asp.net 中 怎么样做一个下载的功能呢??
就是把上传的文件放到数据库了面, 等客户端要下载的时候从数据库里面提取出来供给下载。有没有没实际的例子呢??

解决方案 »

  1.   

    //提供下载的文件,不编码的话文件名会乱码   
            private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar");   
            private string filePath = HttpContext.Current.Server.MapPath("规范.rar");   
            //使用TransmifFile下载文件   
            protected void btnDL1_Click(object sender, EventArgs e)   
            {   
                FileInfo info = new FileInfo(filePath);   
                long fileSize = info.Length;   
                Response.Clear();   
                Response.ContentType = "application/x-zip-compressed";   
                Response.AddHeader("Content-Disposition", "attachment;filename="+ fileName);   
                //不指明Content-Length用Flush的话不会显示下载进度   
                Response.AddHeader("Content-Length", fileSize.ToString());   
                Response.TransmitFile(filePath, 0, fileSize);   
                Response.Flush();   
                Response.Close();   
            }   
      
            //使用WriteFile下载文件   
            protected void btnDL2_Click(object sender, EventArgs e)   
            {   
                FileInfo info = new FileInfo(filePath);   
                long fileSize = info.Length;   
                Response.Clear();   
                Response.ContentType = "application/octet-stream";   
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);   
                //指定文件大小   
                Response.AddHeader("Content-Length", fileSize.ToString());   
                Response.WriteFile(filePath, 0, fileSize);   
                Response.Flush();   
                Response.Close();   
            }   
      
            //使用OutputStream.Write分块下载文件   
            protected void btnDL3_Click(object sender, EventArgs e)   
            {   
                //指定块大小   
                long chunkSize = 102400;   
                //建立一个100K的缓冲区   
                byte[] buffer = new byte[chunkSize];   
                //已读的字节数   
                long dataToRead = 0;   
                FileStream stream = null;   
                try    
                {   
                    //打开文件   
                    stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);   
                    dataToRead = stream.Length;   
      
                    //添加Http头   
                    Response.ContentType = "application/octet-stream";   
                    Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);   
                    Response.AddHeader("Content-Length", dataToRead.ToString());   
      
                    while (dataToRead > 0)    
                    {   
                        if (Response.IsClientConnected)   
                        {   
                            int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));   
                            Response.OutputStream.Write(buffer, 0, length);   
                            Response.Flush();   
                            Response.Clear();   
                            dataToRead -= length;   
                        }   
                        else    
                        {   
                            //防止client失去连接   
                            dataToRead = -1;   
                        }   
                    }   
                }   
                catch (Exception ex)   
                {   
                    Response.Write("Error:" + ex.Message);   
                }   
                finally    
                {   
                    if (stream != null)    
                    {   
                        stream.Close();   
                    }   
                    Response.Close();   
                }   
            }   
      
            //使用BinaryWrite下载文件,大文件效率不行   
            protected void btnDL4_Click(object sender, EventArgs e)   
            {   
                FileStream stream = null;   
                try    
                {   
                    //读文件,大文件一次读入会占用大量内存   
                    stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);   
                    byte[] bytes = new byte[stream.Length];   
                    stream.Read(bytes, 0, bytes.Length);   
                    stream.Close();   
      
                    //添加Http头   
                    Response.ContentType = "application/octet-stream";   
                    Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);   
                    Response.AddHeader("Content-Length", bytes.Length.ToString());   
                    Response.BinaryWrite(bytes);   
                    Response.Flush();   
                }   
                catch (Exception ex)   
                {   
                    Response.Write("Error:" + ex.Message);   
                }   
                finally    
                {   
                    if (stream != null)    
                    {   
                        stream.Close();   
                    }   
                    Response.Close();   
                }   
            }   
            //使用BinaryWrite分块下载文件   
        protected void btnDL5_Click(object sender, EventArgs e)
        {
            //指定区块和缓冲区   
            long chunkSize = 102400;
            byte[] buffer = new byte[chunkSize];
            FileStream stream = null;
            long dataToRead = 0;
            try
            {
                stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                dataToRead = stream.Length;
                //添加Http头   
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
                Response.AddHeader("Content-Length", dataToRead.ToString());            while (dataToRead > 0)
                {
                    if (Response.IsClientConnected)
                    {
                        int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
                        Response.BinaryWrite(buffer);
                        Response.Flush();
                        Response.Clear();                    dataToRead -= length;
                    }
                    else
                    {
                        dataToRead = -1;
                    }
                }        }
            catch (Exception ex)
            {
                Response.Write("Error:" + ex.Message);
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                Response.Close();
            }
        } 
      

  2.   

    修改下~~   private   void   DownLoadFile()   
                      {   
                              try   
                              {   
                                      WebClient   client   =   new   WebClient();   
        
                                      if   (!Directory.Exists(Application.StartupPath   +   @"\update"))   
                                      {   
                                              Directory.CreateDirectory(Application.StartupPath   +   @"\update");   
                                      }   
                                      for   (int   i   =   0;   i   <=   this.listView1.Items.Count   -   1;   i++)   
                                      {   
                                              string   fileName   =   this.listView1.Items[i].SubItems[0].Text;   
                                              string   url   =   @"http://172.16.120.155/update/UpdateFile/"   +   fileName;   
                                              string   file   =   Application.StartupPath   +   "\\update\\"   +   fileName;   
                                              this.label2.Text   =   "正在下载:"   +   fileName;   
        
                                              Stream   myStream   =   client.OpenRead(url);   
                                              byte[]   bBuffer   =   new   byte[10240];   
                                              int   nRealCount   =   0;   
                                              DateTime   dtStart=DateTime.Now   ;   
                                              TimeSpan   ts;   
                                              int   lenth   =   Convert.ToInt32(this.listView1.Items[i].SubItems[1].Text.ToString());   
                                              int   cur   =   0;   
                                              progressBar1.Value   =   0;   
                                              FileStream   fs   =   new   FileStream(file,   FileMode.OpenOrCreate,   FileAccess.Write);   
                                              //do   
                                              //{                                                 
                                              //         dtStart   =   DateTime.Now;   
                                              //         nRealCount   =   myStream.Read(bBuffer,   0,   bBuffer.Length);   
                                              //         if   (nRealCount   >   0)   
                                              //         {   
                                              //                 fs.Write(bBuffer,   0,   nRealCount);   
                                              //         }   
                                              //         ts   =   DateTime.Now   -   dtStart;   
                                              //         cur   =   cur   +   nRealCount;   
                                              //         double   pe   =   cur;   
                                              //         pe   =   pe   *   100   /   lenth;   
                                              //         int   va   =   Convert.ToInt32(pe);   
                                              //         progressBar1.Value   =   va;                                               
                                              //         this.label2.Text   =   "正在下载:"   +   fileName   +   "       "   +   cur   /   1024   +   "   KB/"   +   lenth   /   1024   +   "   KB";   
                                              //         MessageBox.Show(""   +   ts.Milliseconds   +   "     "   +   ts.TotalMilliseconds);   
                                              //         //   this.label2.Text   =   "正在下载:"   +   fileName   +   "       "   +   cur   /   1024   +   "   KB/"   +   lenth   /   1024   +   "   KB"+"     下载速度:"+((double   )nRealCount   /(int)(ts.TotalMilliseconds/1000))   +"   kb/s";   
                                              //         //   计算流量可以用   nRealCount   /   ts.Seconds来进行估算   
                                              //}   
                                              int   value=0;   
                                              int   counter   =   1;   
                                              do   
                                              {   
                                                      if   (counter   %   10   ==   0)   
                                                      {   
                                                              ts   =   DateTime.Now   -   dtStart;   
        
                                                              int   perSecondsValue   =   (int)((double)value   /   (ts.TotalMilliseconds   /   1000))   /   1024;                                                           
        
                                                              this.label3.Text   =   "速度:"   +perSecondsValue   +"   k/s";   
                                                              dtStart   =   DateTime.Now;   
                                                              value   =   0;   
                                                      }                                               
                                                      
                                                      nRealCount   =   myStream.Read(bBuffer,   0,   bBuffer.Length);   
                                                      if   (nRealCount   >   0)   
                                                      {   
                                                              fs.Write(bBuffer,   0,   nRealCount);   
                                                      }   
                                                      cur   =   cur   +   nRealCount;   
                                                      double   pe   =   cur;   
                                                      pe   =   pe   *   100   /   lenth;   
                                                      int   va   =   Convert.ToInt32(pe);   
                                                      progressBar1.Value   =   va;   
                                                        
                                                      this.label2.Text   =   "正在下载:"   +   fileName   +   "       "   +   cur   /   1024   +   "   KB/"   +   lenth   /   1024   +   "   KB";                                                                       
                                                        
                                                      value   +=   nRealCount;   
                                                      counter++;   
                                              }   
                                              while   (nRealCount   >   0);   
                                              fs.Close();                                           
                                              //   client.DownloadFile(url,   file);   
                                              this.listView1.Items[i].SubItems.Add("已下载");   
                                      }   
        
                                      this.progressBar1.Visible   =   false;   
                                      this.label3.Visible   =   false;   
                                      this.label2.Text   =   "正在更新文件,请稍后...";   
                                      string[]   fileDir   =   Directory.GetFileSystemEntries(Application.StartupPath   +   @"\update");   
        
                                      foreach   (string   str   in   fileDir)   
                                      {   
                                              int   pos   =   str.LastIndexOf(@"\");   
                                              string   FileName   =   str.Substring(pos);   
                                              string   FilePath   =   Application.StartupPath   +   FileName;   
                                              File.Copy(str,   FilePath,   true);   
                                      }   
        
                                      this.label2.Text   =   "程序更新已完成!";   
        
                                      this.label1.Text   =   this.finish;   
                                      this.btnNext.Enabled   =   false;   
                                      this.listView1.Visible   =   false;   
                                      this.btnExit.Text   =   "完成(&F)";   
                                      step++;   
                              }   
                              catch   (Exception   errMsg)   
                              {   
                                      MessageBox.Show(errMsg.Message);   
                              }   
                      }
      

  3.   

    不用放入数据库里面 
    放在数据库里面只是相对的路径而已 
    建立一个文件夹 
    讲上传的东西 等于move 进文件夹 
    然后再上传下载的时候将路径放在数据库 就Ok了 
    还有为了 避免  网站上传下载的 流量大 和 文件名称相同的问题
    可以在上传的路径的代码后面加上当前的时间,截取到毫秒。
    不可能会有人在一毫秒上传同样名称的文件吧 
    这样问题就Ok了 
      

  4.   

    很多方法,但是把文件存到数据库里貌似非常的慢,如果是从文件夹里下载方法如下:
    public static void FileDownload(string FileName) //fileName为虚拟路径

    String FullFileName = System.Web.HttpContext.Current.Server.MapPath(FileName); 
    FileInfo DownloadFile = new FileInfo(FullFileName); 
    System.Web.HttpContext.Current.Response.Clear(); 
    System.Web.HttpContext.Current.Response.ClearHeaders(); 
    System.Web.HttpContext.Current.Response.Buffer = false; 
    System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream"; 
    System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8)); 
    System.Web.HttpContext.Current.Response.AppendHeader("Content-Length", DownloadFile.Length.ToString()); 
    System.Web.HttpContext.Current.Response.WriteFile(DownloadFile.FullName); 
    System.Web.HttpContext.Current.Response.Flush(); 
    System.Web.HttpContext.Current.Response.End(); 

    下载,直接调用方法
    /////////////////////////////////////////////////
    大文件下载
    public bool Down(string filepath, string code)
            { 
                bool succ = false;            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";
                    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();
                    }
                }
                return succ;
            }从数据库下载数据:
     string ConnStr = "server=(local);user id=sa;pwd=sa;database=test";
                string strSql = "select * from piclist";
                SqlConnection conn = new SqlConnection(ConnStr);
                conn.Open();            SqlCommand cmd=new SqlCommand(strSql,conn);
                SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Response.ContentType = "application/octet-stream";
                    Response.BinaryWrite((Byte[])reader["pic"]);
                    Response.Write("successful");
                } 
                 reader.Close();
                 conn.Close();
                 Response.End();
    注意把,下边的改一改,然后建一个下载用的数据流,把字节数组放到流中,就可以了