我创建了一个小的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();
Answer 1:
可由于多种原因,如文件会导致此错误是不存在于服务器上的文件安全权限等等等等。
首先,你需要找出错误的确切原因。 这可以通过使用下面的代码 - 来实现
try
{
//Your code
}
catch(WebException e)
{
String status = ((FtpWebResponse)e.Response).StatusDescription;
}
一旦你得到错误的确切原因,你可以去向前来解决它。
这里有一些链接,您可以参考
http://forums.asp.net/t/1777881.aspx/1
http://nickstips.wordpress.com/2010/10/25/c-ftp-upload-error-the-remote-server-returned-an-error-550-file-unavailable-eg-file-not-found-没有访问/
http://www.dreamincode.net/forums/topic/76361-file-upload-to-server/
http://forums.asp.net/t/1374306.aspx/1
Answer 2:
试试这个: FTP://xxx.xxx.xx.xx:21 //路径/文件名
该服务器地址开始你出在根目录下的“//”之后。 即使我有: FTP://xxx.xxx.xx.xx:21 /路径/文件名 ,它并没有带我去正确的目录。
Answer 3:
我遇到了同样的问题,这是我做的:
- 检查OS有写的权利。 查找FTP文件夹=>点击右键=>属性=>安全,那么你必须知道你应该做什么
- 查看FTP服务器打开你登录的用户的写权限。 打开IIS =>点击FTP站点=> FTP授权规则=>添加允许规则=>选择用户或组设置权限
- 查看FTP服务器上的目录,做第2项同样的事情。
我可以用四个画面显示要设置的权限:
Answer 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)
然后用填充请求procced并发送至服务器:)
就这样。
确保在服务器上做工精细和你就像所有的许可使用权证书。
Answer 5:
为了解决这个问题,就需要强制System.Net.FtpWebRequest命令恢复到它的使用方式发出的实际命令之前在.Net框架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);
}
}
http://support.microsoft.com/kb/2134299
Answer 6:
当我有同样的问题,我想以上,一天后的一切后,我意识到,我对于具有“/”文件夹名称之间的空格的URI创建的路径
string uri="192.168.1.101/ Sync/Image.jpg";
上述字符串应该是
string uri="192.168.1.101/Sync/Image.jpg";
这个小小的失误也抛出了同样的错误,这是一个有效的错误,因为这不是我们的文件,如果它包含“/”和文件夹/文件名之间的空格有效路径
Answer 7:
最近我也有这个问题。 我发现的是,当我使用ftpUploadFile例程试图把文件中的根FTP文件夹。 普通FTP命令行工作的罚款。 然而,从发出命令行FTP一个pwd命令透露,这种特殊的服务器被设置在登录不同的当前目录。 改变我的ftpUploadFile包括这个文件夹解决了问题。
Answer 8:
只是扔在擂台上我的帽子,我得到了同样的错误。 当FTPRequest被要求从FTP服务的同一台计算机(同一IP)上的文件。 在请求我所用的机器的IP地址,但一旦我改变了为127.0.0.1它的工作。 有趣的是,来自其他IP地址的请求正在处理和下载的文件,只是不从自身。
希望帮助别人。
Answer 9:
当我与ftpuri和用户名称路径是解决当我创建FTP访问,我已经选择了路径/目录名相比,我有同样的问题,
在当我列入目录名ftpuri它给了错误,当我删除了目录名被解决。
ftpuri错误
“ ftp://www.example.com/Project/yourfilename.ds ”
ftpuri解决
“ ftp://www.example.com/yourfilename.ds ”
FTP访问文件夹“/项目”
Answer 10:
确保目标文件夹“发件箱”的存在。 这是我的问题,错误550。
只需创建上传前目标目录“输出”。
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
}
}
Answer 11:
我有这个问题。 FileZilla的很好,.NET不是。 这是一个WordPress的服务器。 为了得到它的工作,我从这个改变了我的代码:
ftp://XXX.XXX.XXX.XXX//folder// “+ txtFile.Text
至:
的ftp:// [FTPNAME] @ XXX.XXX.XXX.XXX // “+ txtFile.Text
而现在值得庆幸的作品。
我不知道这是否是专门针对WordPress的FTP文件夹。
Answer 12:
在我的情况下,在那失踪我的FTP地址引用的根文件夹。 之后创建问题得到解决的文件夹。
FTP://xxx.xxx.xx.xx:21 // rootfolder /
Answer 13:
我找到了解决办法。 问题是,FTP用户的当前工作目录。 如果你键入一个URL,例如FTP:///path/test.txt它作为RO工作目录的相对路径。 例如CWD是/测试,则使用的路径是/test/path/test.txt。 如果要使用绝对路径,你必须键入喜欢的URL ftp:////path/test.txt。 然后将文件上传的文件夹/path/test.txt,无一例外。
文章来源: FTP, GetResponse (), error 550 File unavailable