C#绝对URI从URL中删除“..”

时间:2011-12-15 15:57:50

标签: c# ftp urlencode url-encoding

我必须通过FTP将文件上传到ftp://ftp.remoteServer.com

我在remoteServer上的根目录包含一个“上传”和一个“下载”文件夹。我需要将我的文件放在“上传”目录中。但登录时,服务器会自动将我放入“下载”文件夹中。

我试过这样做:

string serverTarget = "ftp://ftp.remoteServer.com/";
serverTarget += "../upload/myfile.txt";
Uri target = new Uri(serverTarget);
FTPWebRequest ftp = (FTPWebRequest)FtpWebRequest.Create(target);

using(Stream requestStream = ftp.GetRequestStream()) {
    // Do upload here
}

此代码失败:(550)文件不可用(例如,找不到文件,没有访问权限) 我调试了代码,target.AbsoluteUri返回ftp://ftp.remoteServer.com/upload而不是ftp://ftp.remoteServer.com/../upload(缺少..)

如果我将ftp://ftp.remoteServer.com/../upload放入浏览器,我可以登录并验证这是我要放置文件的正确位置。

如何让FTPWebRequest转到正确的位置?

3 个答案:

答案 0 :(得分:2)

我相信您可以将点编码为%2E以保留URI中的点。

类似于:

string serverTarget = "ftp://ftp.remoteServer.com/%2E%2E/upload/myfile.txt";

答案 1 :(得分:1)

试试这个:

string serverTarget = "../upload/myfile.txt";
Uri uri = new Uri(serverTarget, UriKind.Relative);

答案 2 :(得分:1)

Andy Evans的评论是正确的。

考虑URI:http://ftp.myserver.com/../..表示“将我带到此目录的父级”。但 没有父母!因此,当您获得绝对URL时,您将最终得到http://ftp.myserver.com/解析器无法做任何事情。

我认为问题在于您的FTP服务器的配置。我假设目录结构类似于:

ftproot
    upload
    download

看起来FTP服务会自动将您登录到/ftproot/download。也就是说,URI ftp.myserver.com被映射到本地文件系统上的/ftproot/download。如果是这种情况,那么摆弄URI的任何数量都不会让你随处可见。如果URI根目录映射到下载目录,则无法使用..语法“向上一级然后向下”。

您是否可以使用Filezilla等FTP客户端或Windows FTP命令行工具上传?如果是这样,您采取了哪些步骤?你可以让你的代码做同样的事情吗?