c#.net从ftp下载文件到本地

greymouseyu 2010-01-01 11:18:22
我做了一个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服务器上指定的目录,而不是下载到每个浏览网站的客户的机器,请问是不是这样的呢?
如果是的话,怎么样才能下载文件到每个客户的机器呢?请大家指教。
...全文
902 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zous000888 2010-05-13
  • 打赏
  • 举报
回复
fdsa
greymouseyu 2010-02-09
  • 打赏
  • 举报
回复
引用 18 楼 luotonghua 的回复:
我也遇到了这样的问题,上传和下载都不能实现,只能在 C/S 模式里能够实现,B/S 不能,就是下载也只能下载到网站服务器上,LZ 找到方法了么??

没有解决,老大说这部分功能准备做成cs的。。。
LuoTongHua 2010-01-30
  • 打赏
  • 举报
回复
我也遇到了这样的问题,上传和下载都不能实现,只能在 C/S 模式里能够实现,B/S 不能,就是下载也只能下载到网站服务器上,LZ 找到方法了么??
khjian 2010-01-03
  • 打赏
  • 举报
回复
帮顶
greymouseyu1 2010-01-03
  • 打赏
  • 举报
回复
学习
jshi123 2010-01-03
  • 打赏
  • 举报
回复
<a href="ftp://username:password@url">下载</a>
greymouseyu 2010-01-03
  • 打赏
  • 举报
回复
顶下
greymouseyu 2010-01-02
  • 打赏
  • 举报
回复
不一定非要用FTP,有没有别的方法能达到我的要求?
也就是通过浏览器下载超大文件(超过2个G)到客户机呢
greymouseyu 2010-01-02
  • 打赏
  • 举报
回复
自己再顶一下,期待高手答复
小_虎 2010-01-01
  • 打赏
  • 举报
回复
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mngzilin 的回复:]
引用 7 楼 greymouseyu 的回复:
谢谢mngzilin。你说代码可以改良,如何改良呢?主要是HTTP有最大传输2G这个限制,该如何解决呢?
你说的自己做个ftp客户端程序是CS的吧?那怎么和网页结合起来呢?


只能改良,当然还要受http的限制,不推荐使用。

如果做ftp的话,最好是cs的,直接从ftp服务器上下载,不需要网页。
[/Quote]

哎,我们的系统要求是做成BS的,本来我都没有考虑用ftp,当发现用HTTP下载有大小限制之后,才想改用FTP。但是又发现只能下载到web服务器,却不能到达客户机。。。。 实在是没有办法啊,怎么才能解决啊,真是愁死了!!
polarissky 2010-01-01
  • 打赏
  • 举报
回复
帮顶下,每天进步一点点
mngzilin 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 greymouseyu 的回复:]
谢谢mngzilin。你说代码可以改良,如何改良呢?主要是HTTP有最大传输2G这个限制,该如何解决呢?
你说的自己做个ftp客户端程序是CS的吧?那怎么和网页结合起来呢?
[/Quote]

只能改良,当然还要受http的限制,不推荐使用。

如果做ftp的话,最好是cs的,直接从ftp服务器上下载,不需要网页。
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
自己顶一下,不要沉下去~~
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mngzilin 的回复:]
引用楼主 greymouseyu 的回复:
现在迷惑的是这句话:
fs = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite);
我感觉它只是从ftp下载文件到web服务器上指定的目录,而不是下载到每个浏览网站的客户的机器,请问是不是这样的呢?
如果是的话,怎么样才能下载文件到每个客户的机器呢?请大家指教。


你说的太对了,的确是下载到了服务器上面。

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

谢谢mngzilin。你说代码可以改良,如何改良呢?主要是HTTP有最大传输2G这个限制,该如何解决呢?
你说的自己做个ftp客户端程序是CS的吧?那怎么和网页结合起来呢?
mngzilin 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 greymouseyu 的回复:]
现在迷惑的是这句话:
fs = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite);
我感觉它只是从ftp下载文件到web服务器上指定的目录,而不是下载到每个浏览网站的客户的机器,请问是不是这样的呢?
如果是的话,怎么样才能下载文件到每个客户的机器呢?请大家指教。
[/Quote]

你说的太对了,的确是下载到了服务器上面。

想下载到客户机器上,单从网页上来,必须经过http这条路。而其你的代码经过改良后还是可以下载到客户机器上来的。但是想避免用http,不可能。自己写个插件也不错。或者做个ftp客户端程序都是不错的选择
CODE163 2010-01-01
  • 打赏
  • 举报
回复
我个人认为没有,WEB的本质注定了。你可以写OCX插件。
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
刚才上网看了下FTP相关的资料,发现ftp传输一般都是CS模式的。像我这种BS模式需求的,在FTP服务器和客户机浏览器之间隔了一道web服务器的,有没有什么解决的办法呢?
mngzilin 2010-01-01
  • 打赏
  • 举报
回复
吃完饭回来看
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
没有人知道吗?求高手赐教,急用!
C#写的ASP.NET上传到FTP上,文件文件夹都可以。 首先,选择本地文件或者文件夹,然后点击上传按钮以后,有一个压缩过程,该过程也有一个实时更新的进度条,并可以显示压缩所需的实时更新的剩余时间,压缩完成以后上传,上传也是有一个实时更新的进度条,显示剩余上传所需时间。上传完成以后显示压缩的时间、上传的时间和总共所需的时间。 根据文件流上传,根据文件流进度做的进度条,是真的实实在在的进度条。 代码都有详细的注释,例如: private string ftpUser = "Administrator"; //ftp用户名 private string ftpPassword = "123456"; //ftp密码 public TimeSpan t; //加载进度条总时间 private DateTime startTotalTimeFtp = System.DateTime.Now; private DateTime endTotalTimeFtp = System.DateTime.Now; //压缩用时(为传值做准备) //public TimeSpan zipTime; //定义开始时间、结束时间和之间的时间段,以此来估计完成所需剩余时间 DateTime startTime = System.DateTime.Now; DateTime endTime = System.DateTime.Now; TimeSpan TimeSp; //定义剩余时间 string surPlusTime = string.Empty; //判断是否小于1秒所用 int Ti = 0; //实例化类TimeSpanClass TimeSpanClass timeSpanClass = new TimeSpanClass(); 进度条可以实时动态更新,显示剩余时间,剩余时间也跟随进度条实时动态更新,上传完成显示上传时间。 再次声明,版权所有(花费本人好几个月的心血研究真实的进度条),保证进度条为真正按照文件流的进度所进行,如有问题,可与本人联系!

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧