2011-12-15 2 views
7

에서 내가 ftp://ftp.remoteServer.comC# 절대 URI가 제거 ".."URL

remoteServer를에 내 루트 디렉토리는 "업로드"과 "다운로드"폴더 포함에 FTP를 통해 파일을 업로드해야합니다. 내 파일을 "업로드"디렉토리에 넣어야합니다. 그러나 로그인 할 때 서버가 자동으로 나를 "다운로드"폴더에 둡니다.

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를 올바른 위치로 가져 오려면 어떻게해야합니까?

+0

했던 당신이 표현은 "대신 일반의"@보십시오. – ApolloSoftware

+0

축 어적 문자 그대로 ... – ApolloSoftware

+1

@LostInCode 기본적으로 ftp://ftp.remoteServer.com/../upload/myfile.txt가 ftp://ftp.remoteServer.com/upload/로 표시되는 이유를 묻고 있습니다. myfile.txt? 내 생각 엔/업로드가 이미 사이트 루트에 있고 ../upload는 중복 된 것으로 간주됩니다. –

답변

2

당신은 % 2E로 도트를 인코딩하여 URI에 점들을 유지할 수 있다고 생각합니다. 같은

그래서 뭔가 :

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

그 트릭을 했어! 일단 내가 무엇을 찾을 지 안다면, 나는 이것에 대한 이전의 SO 항목을 발견하기까지했다 : http://stackoverflow.com/questions/480619/why-doesnt-ftpwebrequest-or-webrequest-in-general-accept-a-path –

+0

FTP의 경우 각 Uri 부분은 모든 비 Uri 호환 문자 (공백, 유니 코드 ...)를 허용하는 Uri.EscapeDataString (fileOrFolderName)을 사용하여 구성 할 수 있습니다. –

+0

예를 들어 파일 이름에 임의의 문자를 사용하려면 다음을 사용하십시오. req = (FtpWebRequest) WebRequest.Create (새로운 Uri (경로 ​​+ "/"+ Uri.EscapeDataString (파일 이름))); –

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 서버 구성에 있다고 생각합니다. 그것은 FTP 서비스처럼 보이는

ftproot 
    upload 
    download 

자동 /ftproot/download 당신을 로깅 : 나는 디렉토리 구조가 같이 보입니다 것으로 가정합니다. 즉, URI ftp.myserver.com은 로컬 파일 시스템에서 /ftproot/download으로 매핑됩니다. 그렇다면 URI를 들여다 보지 않아도된다. URI 루트가 다운로드 디렉토리에 매핑되는 경우 .. 구문을 사용하여 "한 수준 위로 이동 한 다음 아래로 이동"할 수있는 방법이 없습니다.

Filezilla 또는 Windows FTP 명령 줄 도구와 같은 FTP 클라이언트를 사용하여 업로드 할 수 있습니까? 그렇다면 수행 할 단계는 무엇입니까? 코드를 똑같이 만들 수 있습니까?