【问题标题】:FtpWebRequest returns error 550 File unavailableFtpWebRequest 返回错误 550 文件不可用
【发布时间】:2013-07-02 13:05:07
【问题描述】:

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

【问题讨论】:

    标签: c# .net file-upload ftp ftpwebrequest


    【解决方案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-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

    【讨论】:

    • 你好。谢谢。实际的错误消息是 550 Access denied。除“特殊权限”外,我已授予我的文件夹完全权限。除了“特殊许可”之外,还有其他可能的原因吗?
    • 大家好。我没有赢。我决定在另一台机器上托管这个应用程序。它工作正常。谢谢。
    • 如果您没有足够的权限或请求中的目录不存在,可能会出现此错误。喜欢xxx.xxx.xxx.xxx/files中的文件
    • 多么有用的提示,我只捕获了“异常”事件,现在我可以清楚地看到错误代表什么!谢谢
    【解决方案2】:

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

    服务器地址后的“//”从根目录开始。即使我有: ftp://xxx.xxx.xx.xx:21/path/filename,它没有把我带到正确的目录。

    【讨论】:

    • 这太可怕了,但它确实对我有用 - 我很震惊,我想这应该是一个错误,但是谢谢。
    • 太棒了!这实际上解决了问题。感谢上帝你写的。一百万年都不会猜到。
    • 也遇到了问题。很棒的提示,永远不会尝试。
    • 这一定是 MS FTP 可执行文件中的错误。我看到了推送到 IIS FTP 端点的较长文件路径的一致随机故障。以上修复了它们。
    • 是的,就这么简单...这些类型的错误占用了我太多的时间,但是感谢您的建议!
    【解决方案3】:

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

    1. 检查操作系统是否有写权限。找到ftp文件夹=>对 click=>properties=>security,那你一定知道该怎么做
    2. 检查 ftp 服务器是否为您登录的用户打开了写入权限。打开IIS=>点击ftp站点=>ftp授权规则=>添加允许规则=>选择用户或组设置权限
    3. 检查 ftp 服务器上的目录,对第 2 项执行相同的操作。

    我可以用四张图片来展示要设置的权限:

    【讨论】:

    • 嗨弗朗西斯。我会试试你的建议。我一来就告诉你。谢谢
    • 记得设置子文件夹的权限。您可以通过以下方式设置最顶层文件夹的权限并将这些权限继承到子文件夹:转到顶级ftp文件夹=>右键单击=>属性=>安全=>高级=>选择用户=>更改权限=>编辑权限(根据需要)和“包括来自对象父级的可继承权限”
    【解决方案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)
    

    然后处理填充请求并发送到服务器:)

    就是这样。

    确保服务器上的所有权限都可以正常工作并且您使用的是正确的凭据。

    【讨论】:

    • 好发现!我自己也遇到了这个问题,并查看了此处提供的链接,但它们没有帮助。无论如何,评论的原因是因为微软官方文档不正确。我按照这个例子:msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx请求地址后缀为“.htm”扩展名,并上传了一个文本文件。我只是认为页面是错误而不是扩展类型。当心其他遵循上述 Microsoft 示例的人!问候,马特
    【解决方案5】:

    我找到了解决方案。问题是 ftp 用户的当前工作目录。如果您键入 ftp:///path/test.txt 之类的 url,它将用作工作目录的相对路径。例如 CWD 是 /test,那么使用的路径是 /test/path/test.txt。如果要使用绝对路径,则必须键入 ftp:////path/test.txt 之类的 url。然后文件上传到文件夹/path/test.txt,无一例外。

    【讨论】:

      【解决方案6】:

      服务器通常会返回带有550 代码的相关错误消息。但是 .NET 框架中的 FTP 实现将所有 FTP 状态代码转换为它自己的(本地化)消息。特别是代码 550 被翻译为“文件不可用”。在许多情况下,这隐藏了真正的问题。

      启用 .NET 日志记录以查看来自服务器的真实错误消息:
      Output log using FtpWebRequest


      以下是一些导致 550 错误的各种常见情况:

      【讨论】:

        【解决方案7】:

        为了解决这个问题,需要强制 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

        【讨论】:

          【解决方案8】:

          确保目标文件夹“发件箱”存在。 那是我的错误 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
                      }
                  }
          

          【讨论】:

            【解决方案9】:

            我遇到了这个问题。 Filezilla 很好,.net 不是。这是一个wordpress服务器。 为了让它工作,我改变了我的代码:

            ftp://XXX.XXX.XXX.XXX//folder//" + txtFile.Text

            到:

            ftp://[FTPNAME]@XXX.XXX.XXX.XXX//" + txtFile.Text

            谢天谢地,它现在可以工作了。

            我不知道这是否特定于 Wordpress FTP 文件夹。

            【讨论】:

              【解决方案10】:

              在我的例子中,我的 ftp 地址中引用的根文件夹丢失了。 创建文件夹后问题就解决了。

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

              【讨论】:

                【解决方案11】:

                我也遇到了同样的问题。用 WireShark 监控流量后,我明白了问题

                我在本地 IIS FTP 服务器上建立了一个名为“testftp”的新 FTP 站点 “testftp”站点指向我计算机硬盘上名为 d:\ftp 的文件夹 每当我尝试在下面的 C# 代码中以粗体执行该行时,我都会收到“550”错误 ftpHostURL="ftp://127.0.0.1/testftp/test.htm"; 请求 = (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 Utility 监控流量时,我看到应用程序正在尝试执行以下代码

                STOR testftp/test.htm

                然后我明白了这个问题。 IIS 期望在不存在的 ftp 根文件夹下有一个名为“testftp”的文件夹。 我正在考虑将“testftp”作为在 IIS 中创建的虚拟文件夹的名称,而 IIS 将其理解为 FTP 根目录下的文件夹

                在 FTP 根文件夹下创建一个名为“testftp”的文件夹解决了我的问题。

                希望这对某人有帮助

                问候 马修

                【讨论】:

                  【解决方案12】:

                  只是把我的帽子扔进戒指,我得到了同样的错误。当 FTPRequest 从同一台计算机(相同 IP)上的 FTP 服务请求文件时。在请求中,我使用了机器的 IP 地址,但一旦我将其更改为 127.0.0.1,它就可以工作了。有趣的是,正在处理来自其他 IP 地址的请求并下载文件,而不是来自其自身。

                  希望对某人有所帮助。

                  【讨论】:

                    【解决方案13】:

                    当我遇到同样的问题时,我尝试了上面的所有方法,一天后我意识到我为 uri 创建的路径在“/”和文件夹名称之间有一个空格

                    string uri="192.168.1.101/ Sync/Image.jpg";
                    

                    上面的字符串应该是

                    string uri="192.168.1.101/Sync/Image.jpg";
                    

                    这个小错误也会引发同样的错误,这是一个有效的错误,因为如果文件在“/”和文件夹/文件名之间包含任何空格,这不是我们文件的有效路径

                    【讨论】:

                      【解决方案14】:

                      我遇到了同样的问题,当我与 ftpuri 和用户名路径进行比较时,它已解决 当我创建 ftp 访问时,我选择了路径作为 / 目录名称

                      在 ftpuri 中,当我包含目录名称时,它给出了错误,当我删除目录名称时,它得到了解决。

                      ftpuri 出错

                      ftp://www.example.com/Project/yourfilename.ds

                      ftpuri 已解决

                      ftp://www.example.com/yourfilename.ds

                      ftp 访问文件夹 “/项目”

                      【讨论】:

                        【解决方案15】:

                        我最近也遇到了这个问题。我发现当我使用 ftpUploadFile 时,例程试图将文件放在根 ftp 文件夹中。普通命令行 ftp 工作正常。然而,从命令行 ftp 发出 pwd 命令显示该特定服务器在登录时设置了不同的当前目录。更改我的 ftpUploadFile 以包含此文件夹解决了该问题。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-02-20
                          • 1970-01-01
                          • 2017-10-28
                          • 2013-06-13
                          相关资源
                          最近更新 更多