2012-02-29 4 views
6

जब मैं निम्नलिखित कोड के साथ फ़ाइल डाउनलोड करता हूं तो यह फ़ाइल को स्थानीय पर गंतव्य पर लिखता है लेकिन फ़ाइल का आकार शून्य होता है। क्या कोई कह सकता है कि ऐसा क्यों होता है और इसे कैसे ठीक किया जाए?ftp जावा में फ़ाइल को ठीक से डाउनलोड नहीं करता है?

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

जावा स्विंग लाइब्रेरी के साथ इसका क्या संबंध है? स्विंग टैग क्यों? –

+0

आपकी स्ट्रीम हैंडलिंग एक दुःस्वप्न है, आप केवल अंतिम फ़ाइलऑटपुटस्ट्रीम बंद कर देते हैं। – home

उत्तर

15

:

तुम भी जिप फ़ाइलों को स्थानांतरित करने के लिए बायनरी फ़ाइल प्रकार और ब्लॉक स्थानांतरण मोड का उपयोग करना चाहिए। मैंने निम्नलिखित कोड जोड़ दिया है और सबकुछ ठीक है। आप सभी को धन्यवाद जिन्होंने मदद की।

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

यह एक बड़ी मदद है। यह डाउनलोड की गई फ़ाइल समस्या को हल करता है, "संग्रहीत फ़ाइल अपूर्ण है"। आपको बहुत - बहुत धन्यवाद! – Richard

+0

यह कुछ भ्रष्ट gzipped (.gz) फ़ाइलों को ठीक करता है जो मुझे एक एफ़टीपी अनुरोध से प्राप्त हो रहा था, धन्यवाद। – Ina

+0

वैसे, अंतिम पंक्ति होनी चाहिए: ** client.setFileType (FTPClient.BINARY_FILE_TYPE); ** –

1

पाश

fos.close(); 

आपका कोड इसे सही ढंग से नहीं कर रहा है में हर यात्रा पर धारा बंद करने का प्रयास है क्योंकि आप पाश है कि नई धारा हर यात्रा बनाता है के लिए एक है, लेकिन केवल पिछले एक बंद

+0

जब मैं फ़ाइल खोलता हूं तो मुझे निम्न त्रुटि मिलती है: 'त्रुटि: अप्राप्य ज़िप फ़ाइल फ़ाइल त्रुटि पढ़ें।' – itro

4

आप दूरस्थ फ़ाइल को इंगित करने के लिए स्थानीय पथ चर का उपयोग कर रहे हैं:

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

आप रिमोट फाइल, न कि स्थानीय गंतव्य के लिए बात करने के लिए इस तरह हैं:

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

इसके अलावा, सुनिश्चित करें कि आप नहीं बल्कि सही अंत में से प्रत्येक फ़ाइल को पढ़ने के बाद अपने fos धारा बंद करते हैं, कर सकते हैं। यदि आप commons.io लाइब्रेरी प्राप्त करते हैं, तो आप IOUtils.closeQuietly(fos); का उपयोग कर सकते हैं, जो नेस्टेड ट्राई-कैच ब्लॉक से बचाता है। अपाचे प्रलेखन निष्कर्ष पर मैं आ कि BINARY_FILE_TYPE अभी तक बसे नहीं किया गया है में खोज करने के बाद

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

जब मैं फ़ाइल खोलता हूं तो डाउनलोड करने के बाद मुझे निम्न त्रुटि मिलती है: ** त्रुटि: अप्राप्य ज़िप फ़ाइल पढ़ने में त्रुटि। ** ऐसा होता है केवल ज़िप फ़ाइल के साथ। जब मैं .csv फ़ाइल डाउनलोड करता हूं तो यह ठीक है। – itro

+0

यह एक अलग समस्या की तरह लगता है। क्या आप ज़िप फ़ाइल को मैन्युअल रूप से डाउनलोड और खोल सकते हैं? ऐसा लगता है कि सर्वर पर config.zip फ़ाइल दूषित है। – seanhodges

+0

पृष्ठ को देखकर ऐसा लगता है कि आप मुझे इस @itro पर हराते हैं, लेकिन मैंने पूर्णता के लिए वैसे भी अपना जवाब अपडेट किया। – seanhodges

संबंधित मुद्दे