C# C“绝对URI删除”&引用;从URL

C# C“绝对URI删除”&引用;从URL,c#,ftp,urlencode,url-encoding,C#,Ftp,Urlencode,Url Encoding,我必须通过FTP上传一个文件到 remoteServer上的我的根目录包含一个“上载”和一个“下载”文件夹。我需要把我的文件放在“上传”目录中。但在登录时,服务器会自动将我放入“下载”文件夹 我试着这样做: string serverTarget = "ftp://ftp.remoteServer.com/"; serverTarget += "../upload/myfile.txt"; Uri target = new Uri(serverTarget); FTPWebRequest ftp

我必须通过FTP上传一个文件到

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
返回为而不是(缺少..)

如果我放在浏览器中,我可以登录并验证这是我想放文件的正确位置

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

试试以下方法:

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

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

考虑URI:
http://ftp.myserver.com/../
的意思是“带我到这个目录的父目录”。但是没有父母!因此,当您导出绝对URL时,您将得到
http://ftp.myserver.com/
解析器不能做任何其他事情

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

ftproot
    upload
    download
string serverTarget = "ftp://ftp.remoteServer.com/%2E%2E/upload/myfile.txt";
看起来FTP服务正在自动将您登录到
/ftproot/download
。也就是说,URI
ftp.myserver.com
映射到本地文件系统上的
/ftproot/download
。如果是这样的话,再多地摆弄URI也不会有任何效果。如果URI根目录映射到下载目录,则无法使用
语法“上一级,下一级”


您是否能够使用FTP客户端(如Filezilla)或Windows FTP命令行工具进行上载?如果是,您采取了哪些步骤?你能让你的代码做同样的事情吗?

我相信你可以将点编码为%2E,以便在URI中保留点

比如:

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

您是否尝试用@“而不是正则”来表示表达式。@LostInCode本质上是问为什么显示为?我的猜测是/upload已经位于您站点的根目录中,并且../upload被视为冗余。@AndyEvans不幸的是,它不是冗余的-ftp.remoteServer.com只让我访问下载目录。ftp.remoteServer.com/upload/被解释为下载中的文件夹directory@AmitApollo添加@没有帮助:(我相信这是一个已知的问题。我在上看过一篇关于此问题的文章。不幸的是,我现在无法登录为您查找此问题。这就解决了问题!一旦我知道要查找什么,我甚至找到了关于此问题的上一个SO条目:对于FTP,每个Uri部分都可以使用Uri.EscapeDataString(fileOrFolderName)构建)允许所有与Uri不兼容的字符(空格、unicode…):例如,要允许文件名中的任何字符,请使用:req=(FtpWebRequest)WebRequest.Create(新Uri(路径+“/”+Uri.EscapeDataString(文件名));