FTP,GetResponse(),错误550文件不可用

时间:2013-07-04 13:37:26

标签: c# .net file-upload ftp

我创建了一个小型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();

15 个答案:

答案 0 :(得分:30)

由于服务器上没有文件,文件安全权限等原因等原因,可能会导致此错误。

首先,您需要找出错误的确切原因。 这可以通过使用以下代码来实现 -

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-e-g-file-not-found-no-access/

http://www.dreamincode.net/forums/topic/76361-file-upload-to-server/

http://forums.asp.net/t/1374306.aspx/1

答案 1 :(得分:17)

试试这个: ftp://xxx.xxx.xx.xx:21//path/filename

服务器地址后面的“//”在根目录下启动。即使我有: ftp://xxx.xxx.xx.xx:21/path/filename,它没有带我到正确的目录。

答案 2 :(得分:7)

我遇到了同样的问题,这就是我所做的:

  1. 检查操作系统是否有权写入。找到ftp文件夹=>右边 click => properties => security,那么你必须知道应该做什么
  2. 检查ftp服务器,打开您记录的用户的写权限。打开IIS =>点击ftp site => ftp授权规则=>添加允许规则=>选择用户或群组来设置权利
  3. 检查ftp服务器上的目录,对第2项执行相同的操作。
  4. 我可以使用四张图片来显示要设置的权限: enter image description here

    enter image description here enter image description here enter image description here

答案 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);
        }
 }

http://support.microsoft.com/kb/2134299

答案 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地址中引用的根文件夹丢失了。 创建文件夹之后,问题就解决了。

ftp://xxx.xxx.xx.xx:21//rootfolder/

答案 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 ”的文件夹解决了我的问题。

希望这对某人有帮助

问候 马修