我做了一个ASP.NET网站(在局域网内使用)。因为我们做的是卫星的项目,所以数据量非常大,每次要下载大概几十G的数据文件。用HTTP来下载是有瓶颈限制的(最大2G),而且速度很慢,所以我就想就把文件的都放在FTP上,用FTP协议来下载。
现在,当用户访问产品列表页时,可以选择某个产品,然后从FTP服务器下载相关的文件到用户本地机器上指定的目录。
以下是我的ftp下载代码:
string TempFolderPath = System.Configuration.ConfigurationManager.AppSettings["TempFolderPath"].ToString();//本地保存目录
 string FtpUserName = System.Configuration.ConfigurationManager.AppSettings["FtpUserName"].ToString();
 string FtpPassWord = System.Configuration.ConfigurationManager.AppSettings["FtpPassWord"].ToString();
 string LocalFileExistsOperation = System.Configuration.ConfigurationManager.AppSettings//是否允许写入["LocalFileExistsOperation"].ToString();
 Uri uri = new Uri("202.156.37.21");
string FileName = Path.GetFullPath(TempFolderPath) + Path.DirectorySeparatorChar.ToString() +  Path.GetFileName(uri.LocalPath); //创建一个文件流
            FileStream fs = null;
            Stream responseStream = null;
            try
            {
                //创建一个与FTP服务器联系的FtpWebRequest对象
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
                //设置请求的方法是FTP文件下载
                request.Method = WebRequestMethods.Ftp.DownloadFile;                //连接登录FTP服务器
                request.Credentials = new NetworkCredential(FtpUserName, FtpPassWord);                //获取一个请求响应对象
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                //获取请求的响应流
                responseStream = response.GetResponseStream();                //判断本地文件是否存在,如果存在,则打开和重写本地文件                if (File.Exists(FileName))                                {
                      if (LocalFileExistsOperation == "write")                      { 
                              fs = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite);                      } 
                }                //判断本地文件是否存在,如果不存在,则创建本地文件
                else                             {
                        fs = File.Create(FileName);
                }                if (fs != null)
                {                    int buffer_count = 65536;
                    byte[] buffer = new byte[buffer_count];
                    int size = 0;
                    while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0)
                    {
                        fs.Write(buffer, 0, size);                    }
                    fs.Flush();
                    fs.Close();
                    responseStream.Close();
                }
            }
            finally
            {
                if (fs != null)
                    fs.Close();
                if (responseStream != null)
                    responseStream.Close();
            }
现在迷惑的是这句话:
fs = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite);
我感觉它只是从ftp下载文件到web服务器上指定的目录,而不是下载到每个浏览网站的客户的机器,请问是不是这样的呢?
如果是的话,怎么样才能下载文件到每个客户的机器呢?请大家指教。

解决方案 »

  1.   

    刚才上网看了下FTP相关的资料,发现ftp传输一般都是CS模式的。像我这种BS模式需求的,在FTP服务器和客户机浏览器之间隔了一道web服务器的,有没有什么解决的办法呢?
      

  2.   

    我个人认为没有,WEB的本质注定了。你可以写OCX插件。
      

  3.   


    你说的太对了,的确是下载到了服务器上面。想下载到客户机器上,单从网页上来,必须经过http这条路。而其你的代码经过改良后还是可以下载到客户机器上来的。但是想避免用http,不可能。自己写个插件也不错。或者做个ftp客户端程序都是不错的选择
      

  4.   


    谢谢mngzilin。你说代码可以改良,如何改良呢?主要是HTTP有最大传输2G这个限制,该如何解决呢?
    你说的自己做个ftp客户端程序是CS的吧?那怎么和网页结合起来呢?
      

  5.   


    只能改良,当然还要受http的限制,不推荐使用。如果做ftp的话,最好是cs的,直接从ftp服务器上下载,不需要网页。
      

  6.   


    哎,我们的系统要求是做成BS的,本来我都没有考虑用ftp,当发现用HTTP下载有大小限制之后,才想改用FTP。但是又发现只能下载到web服务器,却不能到达客户机。   实在是没有办法啊,怎么才能解决啊,真是愁死了!!
      

  7.   

    不一定非要用FTP,有没有别的方法能达到我的要求?
    也就是通过浏览器下载超大文件(超过2个G)到客户机呢
      

  8.   

    <a href="ftp://username:password@url">下载</a>
      

  9.   

    我也遇到了这样的问题,上传和下载都不能实现,只能在 C/S 模式里能够实现,B/S 不能,就是下载也只能下载到网站服务器上,LZ 找到方法了么??