31

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

15 回答 15

38

此错误可能是由于多种原因引起的,例如服务器上不存在文件、文件的安全权限等。

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

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

于 2013-07-04T14:14:18.847 回答
26

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

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

于 2014-12-15T15:10:55.093 回答
7

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

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

我可以用四张图片来展示要设置的权限: 在此处输入图像描述

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

于 2013-07-09T17:07:57.333 回答
4

It could be more simple.

I facing similar issue and i tried all the suggested solution but no one work. I'm figure out in simple manner like this one : take a look

Wrong code at my end

 Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files"), FtpWebRequest)

Change it in this simple one :

 Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files/youfilename.ext"), FtpWebRequest)

then procced with fill request and send to server :)

That's all.

Make sure that all permission on server work fine and u're using right credential.

于 2014-04-03T20:31:50.183 回答
1

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

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


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

于 2020-10-12T06:06:53.740 回答
1

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

于 2018-10-01T07:16:12.903 回答
0

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

于 2013-11-06T21:44:25.397 回答
0

确保目标文件夹“发件箱”存在。那是我的错误 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
            }
        }
于 2017-07-31T12:30:21.693 回答
0

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

ftp://XXX.XXX.XXX.XXX//文件夹// " + txtFile.Text

至:

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

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

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

于 2017-10-25T09:43:59.203 回答
0

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

ftp://xxx.xxx.xx.xx:21//根文件夹/

于 2018-03-16T18:04:56.573 回答
0

我也有同样的问题。用 WireShark 监控流量后,我明白了这个问题

我在本地 IIS FTP 服务器上设置了一个名为“testftp”的新 FTP 站点“testftp”站点指向计算机硬盘上名为 d:\ftp 的文件夹,每当我尝试在 ftpHostURL="ftp://127.0.0.1/testftp/test.htm" 下的 C# 代码中执行粗体行;请求 = (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 ”的文件夹解决了我的问题。

希望这对某人有帮助

问候马修

于 2019-11-05T05:49:10.573 回答
-1

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

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

ftpuri 有错误

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

ftpuri 已解决

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

ftp 访问文件夹“/Project”

于 2017-01-11T15:56:34.100 回答
-1

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

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

上面的字符串应该是

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

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

于 2016-09-15T09:14:58.720 回答
-1

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

希望对某人有所帮助。

于 2015-11-16T01:50:57.917 回答
-1

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

于 2017-02-01T13:54:37.780 回答