尝试通过FTP在远程服务器上的C#上传文件时出错550错误

时间:2015-04-23 13:45:36

标签: c# .net ftp

以下代码在我们内部网络中针对服务器运行时有效。当我更改凭据以反映网络外部的服务器时,我得到550错误的响应。当我像这样捕获异常时:

try { 
    requestStream = request.GetRequestStream();
    FtpWebResponse resp = (FtpWebResponse)request.GetResponse();

}
catch(WebException e) {
    string status = ((FtpWebResponse)e.Response).StatusDescription;
    throw e;
}

状态的值为: " 550命令STOR失败\ r \ n"

我可以使用Filezilla等客户端使用相同的凭据成功上传文件。我已经尝试过使用SetMethodRequiresCWD(),因为其他答案已经建议,这对我没用。

这是代码,它接收一个字符串列表,每个字符串都包含一个文件的完整路径。

private void sendFilesViaFTP(List<string> fileNames) {
    FtpWebRequest request = null;

    string ftpEndPoint = "ftp://pathToServer/";
    string fileNameOnly; //no path
    Stream requestStream;

    foreach(string each in fileNames){
        fileNameOnly = each.Substring(each.LastIndexOf('\\') + 1);

        request = (FtpWebRequest)WebRequest.Create(ftpEndPoint + fileNameOnly);
        request.Method = WebRequestMethods.Ftp.UploadFile;

        request.Credentials = new NetworkCredential("username", "password");

        StreamReader fileToSend = new StreamReader(each);

        byte[] fileContents = Encoding.UTF8.GetBytes(fileToSend.ReadToEnd()); //this is assuming the files are UTF-8 encoded, need to confirm
        fileToSend.Close();
        request.ContentLength = fileContents.Length;

        requestStream = request.GetRequestStream();


        requestStream.Write(fileContents, 0, fileContents.Length);
        requestStream.Close();

        FtpWebResponse response = (FtpWebResponse)request.GetResponse(); //validate this in some way?
        response.Close();
    }
}

2 个答案:

答案 0 :(得分:2)

我有一个非常相似的问题;出于某种原因,使用FtpWebRequest要求我使用凭据对所有文件夹和子文件夹的完全访问权限来使用我的FTP服务器的凭据,而不仅仅是我要保存到的文件夹。

如果我继续使用其他凭据(在其他客户端上工作正常),我会反复收到550错误。

我会尝试另一个拥有所有访问权限的FTP用户,看看是否有效。

答案 1 :(得分:0)

我无法使用FtpWebRequest解决此问题。我使用WebClient重新实现如下所示,它产生了更简洁的代码并且具有工作的附带好处:

    private void sendFilesViaFTP(List<string> fileNames){
        WebClient client = new WebClient();
        client.Credentials = new NetworkCredential("username", "password");
        foreach(string each in fileNames){
            byte[] response = client.UploadFile("ftp://endpoint/" + each, "STOR", each);
            string result = System.Text.Encoding.ASCII.GetString(response);
            Console.Write(result);
        }
    }