C # Абсолютный URI удаляет ".." из URL - PullRequest
7 голосов
/ 15 декабря 2011

Мне нужно загрузить файл по FTP на ftp: //ftp.remoteServer.com

Мой корневой каталог на удаленном сервере содержит папку «upload» и «download».Мне нужно поместить мой файл в папку «upload».Но при входе сервер автоматически помещает меня в папку «скачать».

Я пытался сделать это:

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 ]

2 голосов
/ 15 декабря 2011

Я полагаю, что вы можете кодировать точки как% 2E, чтобы сохранить точки в вашем URI.

Так что-то вроде:

string serverTarget = "ftp://ftp.remoteServer.com/%2E%2E/upload/myfile.txt";
1 голос
/ 15 декабря 2011

Комментарий Энди Эванса верен.

Рассмотрим 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? Если да, то какие шаги вы предпринимаете для этого? Можете ли вы заставить свой код делать то же самое?

1 голос
/ 15 декабря 2011

Попробуйте это:

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