2010-05-05 85 views
4

我试图使用ftp发送文件。我有以下代码:在C#中使用ftp发送文件

string server = "x.x.x.x"; // Just the IP Address 

FileStream stream = File.OpenRead(filename); 
byte[] buffer = new byte[stream.Length]; 

WebRequest request = WebRequest.Create("ftp://" + server); 
request.Method = WebRequestMethods.Ftp.UploadFile;    
request.Credentials = new NetworkCredential(username, password); 

Stream reqStream = request.GetRequestStream(); // This line fails 
reqStream.Write(buffer, 0, buffer.Length); 
reqStream.Close(); 

但是当我运行它,我得到以下错误:

请求的URI是这个FTP命令无效。

请谁能告诉我为什么?我使用这个不正确吗?

+3

'server'是怎么样的? – thelost 2010-05-05 11:29:48

+0

@thelost - 不恰当的问题......他不能告诉我们ftp ...它可能是公开的...你可以使用一个临时字符串来检查完整的服务器URI是否应该如此。其余的看起来不错。 – GxG 2010-05-05 11:32:10

回答

8

我认为你需要指定你上传过的路径和文件名,所以我觉得它应该是的:

WebRequest request = WebRequest.Create("ftp://" + server + "/"); 

WebRequest request = WebRequest.Create("ftp://" + server + "/filename.ext"); 
+1

第一个给出了相同的错误,但一旦文件名被指定,它工作正常 - 谢谢 – 2010-05-05 12:03:23

+0

@ ho1谢谢。如果你正在上传到一个文件夹,那么它应该像'WebRequest request = WebRequest.Create(“ftp://”+ server +“// foldername”+“/ filename.ext”);' – Praveen 2013-05-21 14:31:44

0

当我不得不使用ftp方法,我必须设置一些标志请求对象,如果没有它的功能不工作:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpPath); 
request.KeepAlive = true/false; 
request.UsePassive = true/false; 
request.UseBinary = xxx; 

这些标志依赖于服务器上,如果你有服务器无法访问,那么你可以不知道在这里干什么用的,但你可以测试,看看适用于您的配置。

并且URI的末尾可能缺少文件名,以便服务器知道上传文件的保存位置。

+0

这些标志似乎不是WebRequest对象的属性 – 2010-05-05 12:01:35

+0

@ pm_2:对不起,我忘了添加一行创建请求对象的地方。它实际上是FtpWebRequest类型的一个对象。我更新了答案以显示它。 – user218447 2010-05-05 12:04:07