我做了一个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服务器上指定的目录,而不是下载到每个浏览网站的客户的机器,请问是不是这样的呢?
如果是的话,怎么样才能下载文件到每个客户的机器呢?请大家指教。
现在,当用户访问产品列表页时,可以选择某个产品,然后从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服务器上指定的目录,而不是下载到每个浏览网站的客户的机器,请问是不是这样的呢?
如果是的话,怎么样才能下载文件到每个客户的机器呢?请大家指教。
解决方案 »
- 前台链接onclick调用JS可以 可是到了后台就不行了
- 能在aspx中调com+吗?c#调用时报COM 目标不会实现 IDispatch错误呢?
- 请求一个动态添加控件的解决方法
- http://so.wzilin.com 我搞的搜索引擎,就是太慢了一点,大家帮我提提意见吗?
- ASP.net中怎么用TREEVIEW啊,我的工具箱里的怎么是暗的啊。在WINFORM中是可用的?
- 请各位高人指路!!
- 求C#关于字符串运算的示例
- Textbox控件设置只读或把enabled=false,提交时值会丢失>??????
- 大侠!请问用户控件与定制控件有什么区别?
- 一个小问题,请帮忙!
- 人人网有信消息提示怎么实现的?
- 如何能改变下拉菜单的值来改变页面背景图片啊?急求啊
你说的太对了,的确是下载到了服务器上面。想下载到客户机器上,单从网页上来,必须经过http这条路。而其你的代码经过改良后还是可以下载到客户机器上来的。但是想避免用http,不可能。自己写个插件也不错。或者做个ftp客户端程序都是不错的选择
谢谢mngzilin。你说代码可以改良,如何改良呢?主要是HTTP有最大传输2G这个限制,该如何解决呢?
你说的自己做个ftp客户端程序是CS的吧?那怎么和网页结合起来呢?
只能改良,当然还要受http的限制,不推荐使用。如果做ftp的话,最好是cs的,直接从ftp服务器上下载,不需要网页。
哎,我们的系统要求是做成BS的,本来我都没有考虑用ftp,当发现用HTTP下载有大小限制之后,才想改用FTP。但是又发现只能下载到web服务器,却不能到达客户机。 实在是没有办法啊,怎么才能解决啊,真是愁死了!!
也就是通过浏览器下载超大文件(超过2个G)到客户机呢