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

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

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

我试过这样做:

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去正确的地方?


我相信你可以将这些点编码为%2E来保留你的URI中的点。

所以像这样:

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

尝试这个:

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

安迪埃文斯的评论是正确的。

考虑一下URI: http://ftp.myserver.com/../ : http://ftp.myserver.com/../..意思是,“带我去这个目录的父母”。 但没有父母! 因此,当您获取绝对URL时,您将最终得到http://ftp.myserver.com/解析器无法做到的其他事情。

我认为问题在于您的FTP服务器的配置。 我假设目录结构如下所示:

ftproot
    upload
    download

它看起来像FTP服务自动登录到/ftproot/download 。 也就是说, ftp.myserver.com被映射到本地文件系统上的/ftproot/download 。 如果是这样的话,那么在URI的任何地方摆弄都不会让你感觉到任何地方。 如果URI根被映射到下载目录,那么使用..语法就无法“上升一级然后下降”。

您是否可以使用FTP客户端(如Filezilla)或者Windows FTP命令行工具上传? 如果是这样,那么你做什么步骤? 你可以让你的代码做同样的事情吗?

链接地址: http://www.djcxy.com/p/56747.html

上一篇: C# Absolute URI removes ".." from URL

下一篇: Chrome Renders CSS Differently Online vs Offline?