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

7

我需要通过FTP上传文件到ftp://ftp.remoteServer.com

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

我尝试了以下方法:

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前往正确的位置?

你尝试过使用@符号而不是常规的双引号来表示表达式吗? - apollosoftware.org
1
@LostInCode 本质上,您正在询问为什么 ftp://ftp.remoteServer.com/../upload/myfile.txt 被显示为 ftp://ftp.remoteServer.com/upload/myfile.txt?我猜测 /upload 已经在您的站点根目录下了,而 ../upload 被视为冗余。 - Andy Evans
很遗憾,它不是冗余的 - ftp.remoteServer.com 只能让我进入下载目录。ftp.remoteServer.com/upload/ 被解释为下载目录中的一个文件夹。 - Lost In Code
@AmitApollo 加上 @ 也没有帮助。:( - Lost In Code
我相信这是一个已知的问题。我在Connect上看到过一篇关于它的文章。不幸的是,我现在无法登录找到这个问题给你。 - John Saunders
3个回答

2
我相信你可以将点编码为%2E,以保留URI中的点。
因此,类似于以下内容:
string serverTarget = "ftp://ftp.remoteServer.com/%2E%2E/upload/myfile.txt";

成功了!一旦我知道该找什么,我甚至在 Stack Overflow 上找到了一个以前的条目:https://dev59.com/bUbRa4cB1Zd3GeqPzVnJ - Lost In Code
对于FTP,每个Uri部分可以使用Uri.EscapeDataString(fileOrFolderName)构造,从而允许所有不符合Uri的字符(空格,Unicode...)。 - Renaud Bancel
例如,为了允许文件名中的任何字符,请使用:req =(FtpWebRequest)WebRequest.Create(new Uri(path +“ /”+ Uri.EscapeDataString(filename))); - Renaud Bancel

1

试试这个:

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

1

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

考虑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根目录映射到下载目录,则使用..语法“上一级再下一级”是行不通的。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接