2011-08-13 30 views
5

Tôi không thể tìm thấy ví dụ về truy cập FTP đơn giản của bất kỳ đâu và lớp FTPClient (một vài ví dụ sử dụng) không xuất hiện trong Chỉ mục Lớp Android . Tôi đã truy cập http làm việc, nhưng làm thế nào để làm một FTP đơn giản nhận được? Tất cả những gì tôi muốn làm là tải xuống (ví dụ): ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT Không nên đăng nhập, thay đổi thư mục, v.v. Chỉ cần cho URL đó vào phương thức truy cập http dường như không hoạt động.Làm thế nào để thực hiện một tệp ftp đơn giản trên Android

này cũng tương tự như câu hỏi tại địa chỉ: unable to read file from ftp in android?

Tôi đã thử một đơn giản:

StringBuilder response = new StringBuilder(); 
    URLConnection ftpConn; 
    try { 
    URL netUrl = new URL("ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT"); 
    ftpConn = netUrl.openConnection(); 
    BufferedInputStream bufRd = new BufferedInputStream(ftpConn.getInputStream()); 
    int temp; 
    while ((temp = bufRd.read()) != -1) { 
     response.append(temp); 
    } 
    bufRd.close(); 
    } catch (Exception e) { 
     return "Failure"; 
    } 

nhưng nó được một ngoại lệ trên getInputStream: Không thể kết nối đến máy chủ: Không thể để cấu hình cổng dữ liệu

Ngoài ra, phải có cách thông minh hơn để lấy dữ liệu ra khỏi bộ đệm luồng hơn byte từng byte, không có ở đó? Tôi cũng không thể tìm được.

Cuối cùng, tôi cần phải thực hiện cả truy cập http và ftp, có bất kỳ lý do nào không sử dụng URLConnection cho cả hai loại truy cập không? hoặc là tốt hơn để sử dụng HttpConnection cho http và URLConnection cho ftp?

Cảm ơn!

+0

Bạn có quyền sử dụng internet trong tệp kê khai của mình không? – Jack

+0

Có, tôi đã dành một vài giờ trên đó, đó sẽ là một đoán tốt vài giờ trước. :-) Tôi đã nhận được http để làm việc nhưng không ftp. –

+1

Tôi cũng nhận thấy nếu tôi nhập URL đó vào google trên trình mô phỏng, nó sẽ hiển thị "Trang web không khả dụng" và nó có trong trình duyệt thông thường. Nếu tôi nhập URL đó trực tiếp vào cửa sổ trình duyệt, có vẻ như chỉ mất 50 ký tự, sẽ không mất toàn bộ. Những lỗi này trong trình giả lập? –

Trả lời

8

Whew! Cuối cùng tôi đã nhận được nó. Tôi đã từ bỏ một cách đơn giản hoạt động trong webOS và WPF/C# nơi bạn có thể thực hiện một ftp :: // ... bạn phải sử dụng gói FTPClient.

Sau khi sửa quyền truy cập thư viện (Project | Properties | Đường dẫn xây dựng Java | Thư viện | Thêm JAR ...) Tôi đã bỏ qua các cuộc gọi cho đến khi nó bắt đầu hoạt động. Đây là chuỗi các cuộc gọi FTPClient của tôi. Nó sẽ không hoạt động cho đến khi tôi đặt nó ở chế độ thụ động.

mFTPClient = new FTPClient(); 
    mFTPClient.connect("tgftp.nws.noaa.gov");  
    mFTPClient.login("anonymous","nobody"); 
    mFTPClient.enterLocalPassiveMode(); 
    mFTPClient.changeWorkingDirectory("/data/forecasts/taf/stations"); 
    InputStream inStream = mFTPClient.retrieveFileStream("KABQ.TXT"); 
    InputStreamReader isr = new InputStreamReader(inStream, "UTF8"); 
+0

Có vẻ như tôi có thể kết hợp đường dẫn thư mục và tệp trong cùng một lệnh gọi: InputStream inStream = mFTPClient.retrieveFileStream ("/ data/forecast/taf/stations/KABQ.TXT"); –

+3

Thư viện bên ngoài nào tôi cần sử dụng .. – Pradeep

+0

Tôi đang cố gắng làm điều tương tự như bạn, chỉ với một trạm khác. Chúng tôi có thể xem mã của bạn không? – traisjames

2

Và tôi cũng tìm thấy trên web ở đâu đó một câu trả lời cho câu hỏi 'từng byte một'. Điều này dường như hoạt động để chuyển đổi loại InputStream trực tiếp thành loại Chuỗi:

 String theStr = new Scanner(inStream).useDelimiter("\\A").next(); 
1

Tôi cũng tìm một ví dụ tải xuống ftp đơn giản mà không cần sử dụng libs của bên thứ ba. Không tìm thấy gì, vì vậy hãy đăng giải pháp của tôi ở đây.

URLConnection theo mặc định sử dụng tên người dùng 'ẩn danh' với mật khẩu trống không được nhiều máy chủ FTP chấp nhận vì chúng yêu cầu e-mail làm mật khẩu cho 'ẩn danh'.

Để sử dụng mã sau trong ứng dụng của bạn, chỉ cần thêm try..catch và đảm bảo rằng đọc từ luồng không chặn chuỗi giao diện người dùng.

URL url = new URL("ftp://ftp.mozilla.org/README"); 
URLConnection cn = url.openConnection(); 
cn.setRequestProperty ("Authorization", "Basic " + Base64.encodeToString("anonymous:[email protected]".getBytes(), Base64.DEFAULT)); 

final File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
FileOutputStream fos = new FileOutputStream(dir.getPath() + "/README"); 

InputStream is = cn.getInputStream(); 
int bytesRead = -1; 
byte[] buf = new byte[8096]; 
while ((bytesRead = is.read(buf)) != -1) { 
    fos.write(buf, 0, bytesRead); 
} 
if(is != null)is.close(); 
if(fos != null){ fos.flush(); fos.close(); } 

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian.

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