注册 登录
编程论坛 ASP.NET技术论坛

如何传输大文件

zh520 发布于 2007-11-22 22:18, 814 次点击
这是我写的一段局域网聊天工具中传输文件的代码,可只能传输小文件,如何传输大文件,大哥们帮帮忙!
private void btnSendFile_Click(object sender, System.EventArgs e)
  {
//   Thread t = new Thread(new ThreadStart(SendFile));
//   t.Start();
   Stream s;
   OpenFileDialog d = new OpenFileDialog();
   d.Filter = "All files (*.*)|*.*" ;
   d.Multiselect = false;
   if(d.ShowDialog() == DialogResult.OK)
   {
    if((s = d.OpenFile()) != null)
    {
     FileInfo fi = new FileInfo(d.FileName);
     if(fi.Length>0)
     {
      if((fi.Length/(1024*1024))>3)
      {
       MessageBox.Show("发送文件请不要大于4M !");
       return;
      }
      this.btnSendFile.Enabled = false;
      byte[] contents = new byte[fi.Length];
      string FileSize = (contents.Length<1049)?"0.001":Convert.ToString                                                (Convert.ToDouble(contents.Length)/(1024*1024));
      int length = (FileSize.Length>4) ? 5 : FileSize.Length;
      FileSize = FileSize.Substring(0,length);
      try
      {
       s.Read(contents, 0, contents.Length);
       ServerConst.ChatServ.SendFile(fi.Name,contents,                                                          main.userInfo.UserID,FriendInfo.UserID);
       string Message = string.Format("{0}\r\n[{1}] 向 [{2}] 发送了文件                                                          [{3}] (共{4}M),\r\n稍后请注意查收......",DateTime.Now.ToString                                                        ("[yyyy-MM-dd HH:mm:ss]"),main.userInfo.NickName,FriendInfo.NickName,fi.Name,FileSize);
       tbHistory.AppendText(Message + "\r\n\r\n");
       ServerConst.ChatServ.Send(Message,main.userInfo.UserID,FriendInfo.UserID);
      }
      catch
      {
       MessageBox.Show("发送文件失败!");
      }
      this.btnSendFile.Enabled = true;
     }
     s.Close();
    }
   }
  }
2 回复
#2
bygg2007-11-23 11:19
用 HttpWorkerRequest !
用它的GetPreloadedEntityBody 和 ReadEntityBody方法,它会从IIS为.NET建立pipe并分块读取数据
IServiceProvider provider = (IServiceProvider) HttpContext.Current;
HttpWorkerRequest wr = (HttpWorkerRequest) provider.GetService(typeof(HttpWorkerRequest));
  byte[] bs = wr.GetPreloadedEntityBody();
  ....
  if (!wr.IsEntireEntityBodyIsPreloaded())
  {
        int n = 1024;
        byte[] bs2 = new byte[n];
        while (wr.ReadEntityBody(bs2,n) >0)
       {
             .....
        }
  }
<引用>
#3
bygg2007-11-23 11:21
也可以改配置文件
<httpRuntime  
executionTimeout="400"  
maxRequestLength="40960"  
useFullyQualifiedRedirectUrl="false"/>
1