2011-12-15 32 views
7

tôi phải tải lên một tập tin qua FTP để ftp://ftp.remoteServer.comC# Absolute URI loại bỏ ".." từ URL

thư mục gốc của tôi trên RemoteServer chứa một "upload" và một "download" thư mục. Tôi cần phải đưa tập tin của mình vào thư mục "tải lên". Nhưng khi đăng nhập, máy chủ sẽ tự động đưa tôi vào thư mục "download".

tôi đã cố gắng làm điều này:

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 
} 

Mã này không thành công với: (550) File không có sẵn (ví dụ, file không tìm thấy, không có truy cập) tôi sửa lỗi mã, và target.AbsoluteUri lợi nhuận như ftp://ftp.remoteServer.com/upload thay vì ftp://ftp.remoteServer.com/../upload (thiếu ..)

Nếu tôi đặt ftp://ftp.remoteServer.com/../upload trong trình duyệt, tôi có thể đăng nhập và xác minh đây là địa điểm chính xác nơi tôi muốn đặt tệp của mình.

Làm cách nào để có được FTPWebRequest để đi đến đúng địa điểm?

+0

đã làm bạn cố gắng @ "thay vì thường xuyên" cho các biểu thức. – ApolloSoftware

+0

chuỗi nguyên văn theo nghĩa đen ... – ApolloSoftware

+1

@LostInCode Về cơ bản, bạn đang hỏi tại sao ftp://ftp.remoteServer.com/../upload/myfile.txt đang được hiển thị dưới dạng ftp://ftp.remoteServer.com/upload/ myfile.txt? Tôi đoán là/upload đã ở gốc của trang web của bạn và ../upload được xem là thừa. –

Trả lời

2

Tôi tin rằng bạn có thể mã hóa các dấu chấm dưới dạng% 2E để giữ các dấu chấm trong URI của bạn.

Vì vậy, một cái gì đó như:

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

Điều đó đã làm được điều đó! Khi tôi biết cần tìm gì, tôi thậm chí còn tìm thấy mục nhập SO trước đó về vấn đề này: http://stackoverflow.com/questions/480619/why-doesnt-ftpwebrequest-or-webrequest-in-general-accept-a-path –

+0

Đối với FTP mỗi phần Uri có thể được xây dựng bằng cách sử dụng Uri.EscapeDataString (fileOrFolderName) cho phép tất cả các ký tự không tương thích Uri (dấu cách, unicode ...): –

+0

Ví dụ để cho phép bất kỳ ký tự nào trong tên tệp, sử dụng: req = (FtpWebRequest) WebRequest.Create (new Uri (path + "/" + Uri.EscapeDataString (tên tệp))); –

1

Hãy thử điều này: Cảm nhận

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

Andy Evans' là đúng.

Xem xét URI: http://ftp.myserver.com/../. .. có nghĩa là "đưa tôi đến cha mẹ của thư mục này". Nhưng có không có cha mẹ! Vì vậy, khi bạn lấy được URL tuyệt đối, bạn sẽ kết thúc với http://ftp.myserver.com/ Không có gì khác mà trình phân tích cú pháp có thể làm.

Tôi nghĩ rằng sự cố xảy ra với cấu hình máy chủ FTP của bạn. Tôi cho rằng cấu trúc thư mục trông giống như sau:

ftproot 
    upload 
    download 

Dường như dịch vụ FTP tự động đăng nhập bạn vào /ftproot/download. Tức là, URI ftp.myserver.com được ánh xạ tới /ftproot/download trên hệ thống tệp cục bộ. Nếu đúng như vậy, không có số lượng không quan trọng với URI sẽ đưa bạn đến bất cứ đâu. Nếu gốc URI được ánh xạ tới thư mục tải xuống, không có cách nào bạn có thể, bằng cách sử dụng cú pháp .., "đi lên một cấp và sau đó xuống".

Bạn có thể tải lên bằng ứng dụng khách FTP chẳng hạn như Filezilla hoặc công cụ dòng lệnh của Windows FTP không? Nếu vậy, các bước bạn thực hiện để làm điều đó là gì? Bạn có thể làm cho mã của bạn làm điều tương tự không?

Các vấn đề liên quan