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

greymouseyu 2010-01-01 11:21:04
我做了一个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服务器上指定的目录,而不是下载到每个浏览网站的客户的机器,请问是不是这样的呢?
如果是的话,怎么样才能下载文件到每个客户的机器呢?请大家指教。
...全文
3223 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiqundelang 2010-01-04
  • 打赏
  • 举报
回复
up
gavin_jx 2010-01-04
  • 打赏
  • 举报
回复
似乎单独使用FTP也不能传超过2GB的单个文件,这可能是这些协议的历史遗留问题,要照顾单个文件不能超过2GB的文件系统。我的建议是,要么将大文件分割成不超过2GB的文件,要么使用新型网络协议。比如P2P就可以传送2GB以上大文件。
greymouseyu1 2010-01-03
  • 打赏
  • 举报
回复
顶。。。。
greymouseyu 2010-01-03
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 cyj380236628 的回复:]
pInfoName有对应关系


“Exists”
”true”存 在,”false”不存在

“Path”
存储目录,最后带反斜线",例:C:"TDDownload"

“FileName”
文件名称

“FileSize”
文件大小,以字节为单位,0表示大小未知

“CompletedSize”
已下载大小,以字节为单位

“Percent”
下载进度,带1位小数,例:70.0

“Status”
任务状态,有以下6种状态
“running”: 运行状态
“stopped”: 停止状态
“failed”: 失败状态
“success”: 成功状态
“creatingfile”:正在创建数据文件
“connecting”: 正在连接



[/Quote]

谢谢大哥
又出现问题了。。。。
用迅雷下载1.8G大小的文件都没问题,但是当我下载2.2G的文件时就没反应了。。。
似乎还是突破不了那个HTTP的2G限制。这咋回事呢?

而且还有问题是:调试的时候可以下载文件,但是发布网站后,运行起来就没有反映了,本本不弹出迅雷下载窗口,也不执行下载。
蓝色韵脚 2010-01-03
  • 打赏
  • 举报
回复
pInfoName有对应关系


“Exists”
”true”存 在,”false”不存在

“Path”
存储目录,最后带反斜线",例:C:"TDDownload"

“FileName”
文件名称

“FileSize”
文件大小,以字节为单位,0表示大小未知

“CompletedSize”
已下载大小,以字节为单位

“Percent”
下载进度,带1位小数,例:70.0

“Status”
任务状态,有以下6种状态
“running”: 运行状态
“stopped”: 停止状态
“failed”: 失败状态
“success”: 成功状态
“creatingfile”:正在创建数据文件
“connecting”: 正在连接


蓝色韵脚 2010-01-03
  • 打赏
  • 举报
回复
参数名 含义
pURL 目标URL,必须参数
pFileName 另存名称,默认为空,表示由迅雷处理,可选参数
pPath 存储目录,默认为空,表示由迅雷处理,可选参数
pComments 下载注释,默认为空,可选参数
pReferURL 引用页URL,默认为空,可选参数
nStartMode 开始模式,0手工开始,1立即开始,默认为-1,表示由迅雷处理,可选参数
nOnlyFromOrigin 是否只从原始URL下载,1只从原始URL下载,0多资源下载,默认为0,可选参数
nOriginThreadCount 原始地址下载线程数,范围1-10,默认为-1,表示由迅雷处理,可选参数
xr396464010 2010-01-03
  • 打赏
  • 举报
回复
学习。。。。。。。。。。。。
顶。。。。。。。。
greymouseyu 2010-01-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cyj380236628 的回复:]
可以在C#里引入迅雷,用迅雷下载,这样你服务器就不用另外开端口,对服务器也安全,客户端用迅雷下载也会很快,不会耗费服务器端太多资源,而且也没有大小限制!下面说说方法吧!
1.首先导入DLL
添加引用 -> COM -> ThunderAgent 1.0 Type Library(前提是已安装迅雷)
或者C:\Program Files\Thunder Network\Thunder\ComDlls\ThunderAgent_Now.dll(路径可能有所不同)
2.代码部分: 
THUNDERAGENTLib.AgentClass agent = new THUNDERAGENTLib.AgentClass();//创建对象 agent.AddTask("http://192.168.1.1/abc.rar", "abc.rar", "C:\\", "", "", 1, 0, 5);
agent.CommitTasks2(1);//提交 

兄台先试试吧!

[/Quote]

大哥,又出现问题了。。。。
用迅雷下载1.8G大小的文件都没问题,但是当我下载2.2G的文件时就没反应了。。。
似乎还是突破不了那个HTTP的2G限制。这咋回事呢?
  • 打赏
  • 举报
回复
把你的Web服务器的Ftp服务功能也打开吧
wuyq11 2010-01-01
  • 打赏
  • 举报
回复
public bool fileDownload(string localPath, string localFileName, string ftpPath, string ftpFileName)
{
bool success = false;
FtpWebRequest ftpWebRequest = null;
FtpWebResponse ftpWebResponse = null;
Stream ftpResponseStream = null;
FileStream outputStream = null;

try
{
outputStream = new FileStream(localPath + localFileName, FileMode.Create);

string uri = ftpRootURL + ftpPath + ftpFileName;

ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.UseBinary = true;
ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;

ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();

ftpResponseStream = ftpWebResponse.GetResponseStream();
long contentLength = ftpWebResponse.ContentLength;

int bufferSize = 2048;
byte[] buffer = new byte[bufferSize];
int readCount;

readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
}


success = true;
}
catch (Exception)
{
success = false;
}
finally
{
if (outputStream != null)
{
outputStream.Close();
}

if (ftpResponseStream != null)
{
ftpResponseStream.Close();
}

if (ftpWebResponse != null)
{
ftpWebResponse.Close();
}
}

return success;
}
先下载到服务器在使用Rsponse方式下载文件
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cyj380236628 的回复:]
可以在C#里引入迅雷,用迅雷下载,这样你服务器就不用另外开端口,对服务器也安全,客户端用迅雷下载也会很快,不会耗费服务器端太多资源,而且也没有大小限制!下面说说方法吧!
1.首先导入DLL
添加引用 -> COM -> ThunderAgent 1.0 Type Library(前提是已安装迅雷)
或者C:\Program Files\Thunder Network\Thunder\ComDlls\ThunderAgent_Now.dll(路径可能有所不同)
2.代码部分: 
THUNDERAGENTLib.AgentClass agent = new THUNDERAGENTLib.AgentClass();//创建对象 agent.AddTask("http://192.168.1.1/abc.rar", "abc.rar", "C:\\", "", "", 1, 0, 5);
agent.CommitTasks2(1);//提交 

兄台先试试吧!

[/Quote]

刚刚试过了兄台的这个方法,可行!非常感谢啊!
这两天试过了N多方法,现在只有用迅雷可以实现我的要求,而且可以不用FTP了呵呵。
不过,我还有一点问题想请教兄台!
我的WEB服务器上文件是这样存储的:每个产品在web服务器上都对应着一个文件夹,在里面存着这个产品对应的所有数据文件。我的下载需求是:在产品列表页应该可以选择多个产品,然后把每个产品对应的文件夹中的所有数据文件都下载到客户机。这就需要迅雷有下载文件夹的功能,不知是否可以实现?
还有想向兄台问下,迅雷API的文档有没有,能否给俺传一份,不胜感激!
我的e-mail:64714214@qq.com
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
其使用FTP也是无奈之举,一开始用HTTP直接下载,不但速度很慢(1M/S)左右,而且关键是超过2G大小就报错了。所以才转而考虑把要下载的文件目录发布成FTP。但是很快又发现新问题是只能下载到web服务器,不能下载到浏览网页的客户机,真是愁啊!!
懦芞 2010-01-01
  • 打赏
  • 举报
回复
学习了。
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cyj380236628 的回复:]
其实你用ftp也可以,首先你要获得客户端选择的文件,然后把文件在服务器中的地址赋值给FileName,之后就可以了!这个之前在中石油开发软件做数据同步时也用ftp做过!
[/Quote]

非常感谢cyj380236628大哥,你给了很不错的思路。
你说用FTP也可以,能否说详细一点呢?
我现在操作步骤是:
1.在网页上选择一条产品,传递ID到web服务器端
2.在web服务器端,从数据表取出这个产品对应数据文件的存储路径
3.根据存储路径从ftp取出相应的文件,传输到web服务器端

4.现在该怎么做呢?怎样再下载到客户端呢?(用HTTP有限制,最大2G...)
蓝色韵脚 2010-01-01
  • 打赏
  • 举报
回复
其实你用ftp也可以,首先你要获得客户端选择的文件,然后把文件在服务器中的地址赋值给FileName,之后就可以了!这个之前在中石油开发软件做数据同步时也用ftp做过!
蓝色韵脚 2010-01-01
  • 打赏
  • 举报
回复
可以在C#里引入迅雷,用迅雷下载,这样你服务器就不用另外开端口,对服务器也安全,客户端用迅雷下载也会很快,不会耗费服务器端太多资源,而且也没有大小限制!下面说说方法吧!
1.首先导入DLL
添加引用 -> COM -> ThunderAgent 1.0 Type Library(前提是已安装迅雷)
或者C:\Program Files\Thunder Network\Thunder\ComDlls\ThunderAgent_Now.dll(路径可能有所不同)
2.代码部分:
THUNDERAGENTLib.AgentClass agent = new THUNDERAGENTLib.AgentClass();//创建对象 agent.AddTask("http://192.168.1.1/abc.rar", "abc.rar", "C:\\", "", "", 1, 0, 5);
agent.CommitTasks2(1);//提交

兄台先试试吧!
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
刚才上网看了下FTP相关的资料,发现ftp传输一般都是CS模式的。像我这种BS模式需求的,在FTP服务器和客户机浏览器之间隔了一道web服务器的,有没有什么解决的办法呢?
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kelming 的回复:]
直接在ASP.NET建个文件列表。使用FTP连接下载。你的WEB服务器采用什么的?开放FTP端口就行了。
[/Quote]

什么叫“我的WEB服务器采用什么的”?如何开放FTP端口呢?
你的意思是先把文件保存到web服务器吗?然后再怎么做呢?能给出具体示例代码吗?
greymouseyu 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
public bool fileDownload(string localPath, string localFileName, string ftpPath, string ftpFileName)
        {
            bool success = false;
            FtpWebRequest ftpWebRequest = null;
            FtpWebResponse ftpWebResponse = null;
            Stream ftpResponseStream = null;
            FileStream outputStream = null;

            try
            {
                outputStream = new FileStream(localPath + localFileName, FileMode.Create);

                string uri = ftpRootURL + ftpPath + ftpFileName;

                ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                ftpWebRequest.UseBinary = true;
                ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;

                ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();

                ftpResponseStream = ftpWebResponse.GetResponseStream();
                long contentLength = ftpWebResponse.ContentLength;

                int bufferSize = 2048;
                byte[] buffer = new byte[bufferSize];
                int readCount;

                readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
                }


                success = true;
            }
            catch (Exception)
            {
                success = false;
            }
            finally
            {
                if (outputStream != null)
                {
                    outputStream.Close();
                }

                if (ftpResponseStream != null)
                {
                    ftpResponseStream.Close();
                }

                if (ftpWebResponse != null)
                {
                    ftpWebResponse.Close();
                }
            }

            return success;
        }
先下载到服务器在使用Rsponse方式下载文件
[/Quote]

可以先下载到web服务器,但是再用Rsponse下载是有瓶颈限制的呀,我试过是2G。但我的需求是下几十个G的文件。
spring20130808 2010-01-01
  • 打赏
  • 举报
回复
学习
加载更多回复(1)
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(); 进度条可以实时动态更新,显示剩余时间,剩余时间也跟随进度条实时动态更新,上传完成显示上传时间。 再次声明,版权所有(花费本人好几个月的心血研究真实的进度条),保证进度条为真正按照文件流的进度所进行,如有问题,可与本人联系!

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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