2012-02-29 35 views
6

Khi tôi tải về tập tin với mã sau nó chỉ cần ghi tập tin đến đích trên địa phương nhưng kích thước tập tin là tất cả bằng không. Ai có thể nói Tại sao điều này xảy ra và cách khắc phục?ftp không tải xuống tệp đúng cách trong java?

import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPFile; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class FtpDownload { 
public static void main(String[] args) { 
    FTPClient client = new FTPClient(); 
    FileOutputStream fos = null; 
    String filename = "config.zip"; 
    try { 
     client.connect("ftpsrv"); 
     client.login("user", "user"); 

     for (FTPFile file : client.listFiles()) { 
      filename = "C:\\tmp\\user\\" + file.getName(); 
      if (file.isFile()) { 
       fos = new FileOutputStream(filename); 
       client.retrieveFile(filename, fos); 
       System.out.println(file.getName()); 
      } else if (file.isDirectory()) { 
       System.out.println("directory: " + file.getName()); 
      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fos != null) { 
       fos.close(); 
      } 
      client.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
} 
+0

Điều này có liên quan gì với thư viện Java Swing? Tại sao thẻ Swing? –

+0

Xử lý luồng của bạn là một cơn ác mộng, bạn chỉ đóng FileOutputStream cuối cùng. – home

Trả lời

15

sau khi tìm kiếm trong tài liệu Apache tôi đi đến kết luận rằng BINARY_FILE_TYPE chưa được giải quyết. tôi có thêm mã sau đây và mọi thứ đều ổn. cảm ơn tất cả các bạn đã giúp đỡ.

try { 
    client.connect(ftpServer); 
    client.login(username, password); 
    // following line fixed my zip file corruption issue. 
    client.setFileType(FTP.BINARY_FILE_TYPE); 
+0

Đây là một trợ giúp tuyệt vời. Điều này khắc phục sự cố tệp đã tải xuống, "tệp đã lưu trữ chưa hoàn thành". Cảm ơn bạn rất nhiều! – Richard

+0

Điều này cố định một số gzipped tham nhũng (.gz) tập tin tôi đã nhận được từ một yêu cầu FTP, cảm ơn. – Ina

+0

Nhân tiện, dòng cuối cùng phải là: ** client.setFileType (FTPClient.BINARY_FILE_TYPE); ** –

1

cố gắng đóng dòng trên mỗi iteration trong vòng lặp

fos.close(); 

Mã của bạn không làm việc đó một cách chính xác bởi vì bạn có một vòng lặp for mà tạo ra dòng mới mỗi lần lặp nhưng chỉ đóng người cuối cùng

+0

sau khi tải xuống khi tôi mở tệp tôi nhận được lỗi sau: ´Lỗi: không thể khôi phục tệp zip lỗi đọc.´ – itro

4

Bạn đang sử dụng biến con đường địa phương để trỏ đến tập tin từ xa:

filename = "C:\\tmp\\user\\" + file.getName(); 
... 
client.retrieveFile(filename, fos); 

Bạn muốn trỏ đến tập tin từ xa, không phải là điểm đến địa phương, như thế này:

client.retrieveFile(file.getName(), fos); 

Ngoài ra, hãy chắc chắn rằng bạn đóng fos luồng của mình sau khi đọc mỗi tập tin, chứ không phải ngay lúc kết thúc. Bạn có thể sử dụng IOUtils.closeQuietly(fos); cho điều này nếu bạn nhận được thư viện commons.io, tránh các khối try-catch lồng nhau.

Bạn cũng nên sử dụng Binary loại tập tin và BLOCK chế độ chuyển giao để chuyển file zip:

client.setFileTransferMode(FTPClient.BLOCK_TRANSFER_MODE); 
client.setFileType(FTPClient.BINARY_FILE_TYPE); 
+0

sau khi tải xuống khi tôi mở tệp tôi nhận được lỗi sau: ** Lỗi: không thể khôi phục tệp zip lỗi đọc. ** điều này xảy ra chỉ với tập tin zip.when tôi tải về tập tin .csv nó là ok. – itro

+0

Điều đó nghe giống như một vấn đề khác hoàn toàn. Bạn có thể tải xuống và mở tệp zip theo cách thủ công không? Có vẻ như tệp config.zip trên máy chủ bị hỏng. – seanhodges

+0

Nhìn xuống trang có vẻ như bạn đã đánh tôi với @itro này, nhưng tôi vẫn cập nhật câu trả lời của mình cho đầy đủ. – seanhodges

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