我创建了一个小型Windows窗体应用程序,将文件上传到我们客户端的某个ftp站点。但我遇到的问题是,当我在本地计算机上运行此应用程序时,它会成功上传文件。但是,如果我在我们的服务器上运行此程序,我会收到此错误消息;
远程服务器返回错误:(550)文件不可用(例如,找不到文件,无法访问该文件),在此行'objFTPRequest.GetRequestStream();'。
有人知道为什么吗?我需要配置防火墙吗?这是我的代码;
FileInfo objFile = new FileInfo(filename);
FtpWebRequest objFTPRequest;
// Create FtpWebRequest object
objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/outbox/" + objFile.Name));
// Set Credintials
objFTPRequest.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
// By default KeepAlive is true, where the control connection is
// not closed after a command is executed.
objFTPRequest.KeepAlive = false;
// Set the data transfer type.
objFTPRequest.UseBinary = true;
// Set content length
objFTPRequest.ContentLength = objFile.Length;
// Set request method
objFTPRequest.Method = WebRequestMethods.Ftp.UploadFile;
// Set buffer size
int intBufferLength = 16 * 1024;
byte[] objBuffer = new byte[intBufferLength];
// Opens a file to read
FileStream objFileStream = objFile.OpenRead();
// Get Stream of the file
Stream objStream = objFTPRequest.GetRequestStream();
int len = 0;
while ((len = objFileStream.Read(objBuffer, 0, intBufferLength)) != 0)
{
// Write file Content
objStream.Write(objBuffer, 0, len);
}
objStream.Close();
objFileStream.Close();
答案 0 :(得分:30)
由于服务器上没有文件,文件安全权限等原因等原因,可能会导致此错误。
首先,您需要找出错误的确切原因。 这可以通过使用以下代码来实现 -
try
{
//Your code
}
catch(WebException e)
{
String status = ((FtpWebResponse)e.Response).StatusDescription;
}
一旦得到确切的错误原因,您可以继续解决。
以下是您可以参考的链接
http://forums.asp.net/t/1777881.aspx/1
http://www.dreamincode.net/forums/topic/76361-file-upload-to-server/
答案 1 :(得分:17)
试试这个: ftp://xxx.xxx.xx.xx:21//path/filename
服务器地址后面的“//”在根目录下启动。即使我有: ftp://xxx.xxx.xx.xx:21/path/filename,它没有带我到正确的目录。
答案 2 :(得分:7)
我遇到了同样的问题,这就是我所做的:
我可以使用四张图片来显示要设置的权限:
答案 3 :(得分:4)
可能更简单。
我面临类似的问题,我尝试了所有建议的解决方案,但没有人工作。 我像这样简单地弄清楚:看看
我的代码错误
Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files"), FtpWebRequest)
用这个简单的方法改变它:
Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files/youfilename.ext"), FtpWebRequest)
然后使用填充请求进行处理并发送到服务器:)
这就是全部。
确保服务器上的所有权限都正常,并且您正在使用正确的凭据。
答案 4 :(得分:1)
为了解决此问题,需要强制System.Net.FtpWebRequest命令恢复到以前在.Net Framework 2.0 / 3.5中工作方式的旧行为,并在发布之前发出额外的CWD命令实际的命令。
为了执行此操作,需要在调用System.Net.FtpWebRequest类的任何实例之前放置以下代码。 下面的代码只需要调用一次,因为它会更改整个应用程序域的设置。
private static void SetMethodRequiresCWD()
{
Type requestType = typeof(FtpWebRequest);
FieldInfo methodInfoField = requestType.GetField("m_MethodInfo", BindingFlags.NonPublic | BindingFlags.Instance);
Type methodInfoType = methodInfoField.FieldType;
FieldInfo knownMethodsField = methodInfoType.GetField("KnownMethodInfo", BindingFlags.Static | BindingFlags.NonPublic);
Array knownMethodsArray = (Array)knownMethodsField.GetValue(null);
FieldInfo flagsField = methodInfoType.GetField("Flags", BindingFlags.NonPublic | BindingFlags.Instance);
int MustChangeWorkingDirectoryToPath = 0x100;
foreach (object knownMethod in knownMethodsArray)
{
int flags = (int)flagsField.GetValue(knownMethod);
flags |= MustChangeWorkingDirectoryToPath;
flagsField.SetValue(knownMethod, flags);
}
}
答案 5 :(得分:1)
当我遇到同样的问题时,我尝试了上面的所有内容,一天之后,我意识到我为uri创建的路径之间有一个空格" /"和文件夹名称
string uri="192.168.1.101/ Sync/Image.jpg";
上面的字符串应该是
string uri="192.168.1.101/Sync/Image.jpg";
这个小错误也会抛出相同的错误并且它是一个有效的错误,因为如果它包含" /"之间的任何空格,这对我们的文件来说不是有效路径。和文件夹/文件名
答案 6 :(得分:1)
我最近也遇到过这个问题。我发现当我使用ftpUploadFile时,例程试图将文件放在根ftp文件夹中。正常的命令行ftp运行正常。但是,从命令行ftp发出pwd命令显示此特定服务器在登录时设置了不同的当前目录。更改我的ftpUploadFile以包含此文件夹解决了该问题。
答案 7 :(得分:1)
服务器通常返回带有550
代码的相关错误消息。但是.NET框架中的FTP实现将所有FTP状态代码转换为它自己的(本地化)消息。特别地,代码550被翻译为“文件不可用” 。在许多情况下,这掩盖了真正的问题。
启用.NET日志记录以查看来自服务器的真实错误消息:
Output log using FtpWebRequest
以下是导致550错误的各种常见情况:
答案 8 :(得分:0)
只是把我的帽子戴在戒指上,我得到了同样的错误。当FTPRequest在同一台计算机(同一IP)上从FTP服务请求文件时。在请求中我使用的是机器的IP地址,但是一旦我将其更改为127.0.0.1就可以了。有趣的是,来自其他IP地址的请求正在处理和下载文件,而不是自己。
希望有人帮助过。
答案 9 :(得分:0)
我遇到了同样的问题,当我与ftpuri和用户名路径进行比较时,它已得到解决 当我创建ftp访问时,我选择路径为/目录名
在ftpuri中,当我包含目录名称时,它给出了错误,当我删除目录名称时,它就被解析了。
ftpuri有错误
“ftp://www.example.com/Project/yourfilename.ds”
ftpuri已解决
“ftp://www.example.com/yourfilename.ds”
ftp访问文件夹 “/项目”
答案 10 :(得分:0)
确保目标文件夹“发件箱”存在。 这是我的错误550的问题。
在上传之前,只需创建目标目录“output”。
try
{
WebRequest request = WebRequest.Create("ftp://" + ftpServerIP + "/outbox");
request.Credentials = new NetworkCredential("user", "password");
request.Method = WebRequestMethods.Ftp.MakeDirectory;
using (var resp = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine(resp.StatusCode);
}
}
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
response.Close();
//already exists
}
else
{
response.Close();
//doesn't exists = it's another exception
}
}
答案 11 :(得分:0)
我有这个问题。 Filezilla很好,.net不是。这是一个wordpress服务器。 为了让它工作,我改变了我的代码:
ftp://XXX.XXX.XXX.XXX//folder//" + txtFile.Text
为:
ftp://[FTPNAME]@XXX.XXX.XXX.XXX//" + txtFile.Text
现在谢天谢地。
我不知道这是否特定于Wordpress FTP文件夹。
答案 12 :(得分:0)
在我的情况下,我的ftp地址中引用的根文件夹丢失了。 创建文件夹之后,问题就解决了。
答案 13 :(得分:0)
我找到了解决方案。问题是ftp用户的当前工作目录。如果键入ftp:///path/test.txt之类的URL,它将用作工作目录中的相对路径。例如,CWD为/ test,则使用的路径为/test/path/test.txt。如果要使用绝对路径,则必须输入ftp://///path/test.txt之类的URL。然后将文件毫无例外地上传到/path/test.txt文件夹中。
答案 14 :(得分:0)
我也遇到了同样的问题。在使用WireShark监控流量后,我了解了问题
我已经在本地IIS FTP服务器上设置了名为“ testftp”的新FTP站点 “ testftp”站点指向我计算机硬盘上名为d:\ ftp的文件夹 每当我尝试在下面的C#代码中以粗体执行该行时,我都会收到“ 550”错误 ftpHostURL =“ ftp://127.0.0.1/testftp/test.htm”; request =(FtpWebRequest)WebRequest.Create(ftpHostURL); request.Proxy = new WebProxy(); // -----代理绕过(使用HTTP代理时不支持请求的FTP命令)
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
// uploadFilePath = "d://test//tt.txt";
using (var requestStream = request.GetRequestStream())
{
using (var input = File.OpenRead(uploadFilePath))
{
input.CopyTo(requestStream);
}
}
我尝试了各种网站中提到的许多解决方案,但没有任何帮助。然后,我遇到了一个建议使用WireShark监视流量的站点。
在使用RawCap实用程序监视流量时,我看到该应用程序正在尝试执行以下代码
STOR testftp / test.htm
然后我理解了这个问题。 IIS期望在ftp根文件夹下有一个名为“ testftp ”的文件夹。 我正在考虑将“ testftp ”作为在IIS中创建的虚拟文件夹的名称,因为IIS将其理解为FTP根目录下的文件夹
在FTP根文件夹下创建一个名为“ testftp ”的文件夹解决了我的问题。
希望这对某人有帮助
问候 马修