2012-06-26 11 views
10

मैं एक फ़ाइल अपलोड करने के लिए अपाचे कॉमन्स एफ़टीपी का उपयोग कर रहा हूं। अपलोड करने से पहले मैं यह जांचना चाहता हूं कि फ़ाइल सर्वर पर पहले से मौजूद है या नहीं और उसी सर्वर पर बैकअप निर्देशिका में बैकअप लें।जावा में एक ही सर्वर पर एक निर्देशिका में ftp सर्वर पर एक फ़ाइल की प्रतिलिपि कैसे करें?

क्या किसी को भी एक सर्वर पर एक FTP सर्वर से एक बैकअप निर्देशिका में फ़ाइल कॉपी करने के बारे में पता है?

public static void uploadWithCommonsFTP(File fileToBeUpload){ 
    FTPClient f = new FTPClient(); 
    FTPFile backupDirectory; 
    try { 
     f.connect(server.getServer()); 
     f.login(server.getUsername(), server.getPassword()); 
     FTPFile[] directories = f.listDirectories(); 
     FTPFile[] files = f.listFiles(); 
     for(FTPFile file:directories){ 
      if (!file.getName().equalsIgnoreCase("backup")) { 
       backupDirectory=file; 
      } else { 
       f.makeDirectory("backup"); 
      } 
     } 
     for(FTPFile file: files){ 
      if(file.getName().equals(fileToBeUpload.getName())){ 
       //copy file to backupDirectory 
      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

संपादित कोड: अभी भी एक समस्या है जब मैं बैकअप ज़िप फ़ाइल, बैकअप एड फ़ाइल दूषित है।

क्या किसी भी शरीर को इसका कारण पता है?

public static void backupUploadWithCommonsFTP(File fileToBeUpload) { 
    FTPClient f = new FTPClient(); 
    boolean backupDirectoryExist = false; 
    boolean fileToBeUploadExist = false; 
    FTPFile backupDirectory = null; 
    try { 
     f.connect(server.getServer()); 
     f.login(server.getUsername(), server.getPassword()); 
     FTPFile[] directories = f.listDirectories(); 
     // Check for existence of backup directory 
     for (FTPFile file : directories) { 
      String filename = file.getName(); 
      if (file.isDirectory() && filename.equalsIgnoreCase("backup")) { 
       backupDirectory = file; 
       backupDirectoryExist = true; 
       break; 
      } 
     } 
     if (!backupDirectoryExist) { 
      f.makeDirectory("backup"); 
     } 
     // Check if file already exist on the server 
     f.changeWorkingDirectory("files"); 
     FTPFile[] files = f.listFiles(); 
     f.changeWorkingDirectory("backup"); 
     String filePathToBeBackup="/home/user/backup/"; 
     String prefix; 
     String suffix; 
     String fileNameToBeBackup; 
     FTPFile fileReadyForBackup = null; 
     f.setFileType(FTP.BINARY_FILE_TYPE); 
     f.setFileTransferMode(FTP.BINARY_FILE_TYPE); 
     for (FTPFile file : files) { 
      if (file.isFile() && file.getName().equals(fileToBeUpload.getName())) { 
       prefix = FilenameUtils.getBaseName(file.getName()); 
       suffix = ".".concat(FilenameUtils.getExtension(file.getName())); 
       fileNameToBeBackup = prefix.concat(Calendar.getInstance().getTime().toString().concat(suffix)); 
       filePathToBeBackup = filePathToBeBackup.concat(fileNameToBeBackup); 
       fileReadyForBackup = file; 
       fileToBeUploadExist = true; 
       break; 
      } 
     } 
     // If file already exist on the server create a backup from it otherwise just upload the file. 
     if(fileToBeUploadExist){ 
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
      f.retrieveFile(fileReadyForBackup.getName(), outputStream); 
      InputStream is = new ByteArrayInputStream(outputStream.toByteArray()); 
      if(f.storeUniqueFile(filePathToBeBackup, is)){ 
       JOptionPane.showMessageDialog(null, "Backup succeeded."); 
       f.changeWorkingDirectory("files"); 
       boolean reply = f.storeFile(fileToBeUpload.getName(), new FileInputStream(fileToBeUpload)); 
       if(reply){ 
        JOptionPane.showMessageDialog(null,"Upload succeeded."); 
       }else{ 
        JOptionPane.showMessageDialog(null,"Upload failed after backup."); 
       } 
      }else{ 
       JOptionPane.showMessageDialog(null,"Backup failed."); 
      } 
     }else{ 
      f.changeWorkingDirectory("files"); 
      f.setFileType(FTP.BINARY_FILE_TYPE); 
      f.enterLocalPassiveMode(); 
      InputStream inputStream = new FileInputStream(fileToBeUpload); 
      ByteArrayInputStream in = new ByteArrayInputStream(FileUtils.readFileToByteArray(fileToBeUpload)); 
      boolean reply = f.storeFile(fileToBeUpload.getName(), in); 
      System.out.println("Reply code for storing file to server: " + reply); 
      if(!f.completePendingCommand()) { 
       f.logout(); 
       f.disconnect(); 
       System.err.println("File transfer failed."); 
       System.exit(1); 
      } 
      if(reply){ 

       JOptionPane.showMessageDialog(null,"File uploaded successfully without making backup." + 
         "\nReason: There wasn't any previous version of this file."); 
      }else{ 
       JOptionPane.showMessageDialog(null,"Upload failed."); 
      } 
     } 
     //Logout and disconnect from server 
     in.close(); 
     f.logout(); 
     f.disconnect(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
+0

आप क्या समझ में नहीं आया? यदि आप स्रोत पथ और विचलन पथ को जानते हैं तो आप केवल पढ़ने के लिए फ़ाइल खोल सकते हैं (बफर के साथ) और विचलन पथ पर लिख सकते हैं। आप फाइलों को कॉपी करने के लिए ओएस विशिष्ट एपीआई का भी उपयोग कर सकते हैं। –

+0

फ़ाइल प्रकार FTPFile है। मैं बफर में कैसे पढ़ और लिख सकता हूं? क्या आपका मतलब है 'फ़ाइलइनपुटस्ट्रीम = = नई फ़ाइल इनपुटस्ट्रीम (फ़ाइल) में; ' – itro

+0

http://www.dreamincode.net/forums/topic/32031-ftp-in-java-using-apache-commons-net/ –

उत्तर

16

आप Apache Commons शुद्ध FTPClient उपयोग कर रहे हैं, वहाँ (यदि user उचित अनुमतियां) किसी अन्य स्थान पर एक स्थान से एक फ़ाइल स्थानांतरित करने के लिए एक सीधा तरीका है।

ftpClient.rename(from, to); 

या, आप ftp commands से परिचित हैं, तो आप आप किसी भी अन्य ग्राहक का उपयोग कर रहे हैं, तो जैसे

ftpClient.sendCommand(FTPCommand.yourCommand, args); 
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { 
    //command successful; 
} else { 
    //check for reply code, and take appropriate action. 
} 

कुछ का उपयोग कर सकते, प्रलेखन के माध्यम से जाना, ग्राहक कार्यान्वयन के बीच काफी परिवर्तन नहीं किया नहीं होते।

अद्यतन:

दृष्टिकोण से ऊपर to निर्देशिका में फाइल को ले जाता है, यानी, फ़ाइल अब from निर्देशिका में नहीं होगी। मूल रूप से ftp प्रोटोकॉल को फ़ाइलों को local <-> remote या remote <-> other remote से स्थानांतरित करने के लिए किया गया था लेकिन सर्वर में स्थानांतरित नहीं किया गया था।

यहां के आसपास का काम आसान होगा, स्थानीय InputStream पर पूरी फ़ाइल प्राप्त करें और इसे बैक अप निर्देशिका में एक नई फ़ाइल के रूप में सर्वर पर वापस लिखें।

पूरी फाइल प्राप्त करने के लिए,

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
ftpClient.retrieveFile(fileName, outputStream); 
InputStream is = new ByteArrayInputStream(outputStream.toByteArray()); 

अब, बैकअप निर्देशिका में इस धारा की दुकान। सबसे पहले हमें बैकअप निर्देशिका में कार्य निर्देशिका को बदलने की जरूरत है।

// assuming backup directory is with in current working directory 
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);//binary files 
ftpClient.changeWorkingDirectory("backup"); 
//this overwrites the existing file 
ftpClient.storeFile(fileName, is); 
//if you don't want to overwrite it use storeUniqueFile 

आशा इसकी सहायता से आप ..

+1

आपके समाधान 'ftpClient.rename (से, से) के साथ;' मैं इसका नाम बदल सकता हूं लेकिन फिर भी उसी निर्देशिका में रहता है जो मुझे उम्मीद नहीं है (बैकअप निर्देशिका)। मैं इसे कैसे हल कर सकता हूं? मैं बैकअप पथ कैसे प्राप्त कर सकता हूं? दूसरी तर्क के लिए सही पथ क्या है यदि मैं चाहता हूं कि फ़ाइल को बटुप निर्देशिका में कॉपी किया जाए? मेरे पास रूट निर्देशिका है जो वहां मौजूद सभी फाइलें और बैकअप निर्देशिका है जिसे मैं रूट निर्देशिका के तहत बना देता हूं। – itro

+0

कुछ 'ftpClient.rename ("/ root/your_file.txt", "/root/backup/your_file_bak.txt"); '। यहां ध्यान देने योग्य एक बात यह है कि यह 'से' निर्देशिका से' to' निर्देशिका तक जाती है। आप इसे अब से 'निर्देशिका' में नहीं रखेंगे। –

+0

ओह्ह्ह्ह्ह्ह्ह्ह्ह नहीं, मैं इसकी प्रतिलिपि बनाना चाहता हूं कि इसे बैकअप में स्थानांतरित न करें। – itro

1

इस तरह की कोशिश करो,

मैं अपाचे के पुस्तकालय का उपयोग कर रहा हूँ।

ftpClient.rename (करने के लिए, से) यह आसान हो जाएगा, मैं कोड में नीचे जहां ftpClient.rename (से, करने के लिए) को जोड़ने के लिए उल्लेख किया है।

public void goforIt(){ 


     FTPClient con = null; 

     try 
     { 
      con = new FTPClient(); 
      con.connect("www.ujudgeit.net"); 

      if (con.login("ujud3", "Stevejobs27!!!!")) 
      { 
       con.enterLocalPassiveMode(); // important! 
       con.setFileType(FTP.BINARY_FILE_TYPE); 
       String data = "/sdcard/prerakm4a.m4a"; 
       ByteArrayInputStream(data.getBytes()); 
       FileInputStream in = new FileInputStream(new File(data)); 
       boolean result = con.storeFile("/Ads/prerakm4a.m4a", in); 
       in.close(); 
       if (result) 
         { 
          Log.v("upload result", "succeeded"); 

// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ यहाँ बैकअप जोड़े $$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ //

    // Now here you can store the file into a backup location 

        // Use ftpClient.rename(from, to) to place it in backup 

// $$$$$$$$$$$$$$$ $$$$$$$$$$$$$$ बैकअप जोड़ें यहां $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //

     } 
       con.logout(); 
       con.disconnect(); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 
+0

के साथ कोड अपडेट करता हूं यदि सर्वर में फ़ाइल मौजूद है तो मुझे चेकआउट करना चाहिए और फिर बैकअप लें और फ़ाइल अपलोड करें। मुझे लगता है कि आपने यहां कुछ और किया है – itro

+0

इसे एक बार फिर से ठीक से देखें, अगर (परिणाम) ब्लॉक है जो फाइल को सफलतापूर्वक सर्वर पर संग्रहीत करने के बाद निष्पादित करेगा ..... –

-1

एक ही सर्वर (चाल) पर बैकअप के लिए, आप उपयोग कर सकते हैं:

String source="/home/user/some"; 
String goal ="/home/user/someOther"; 
FTPFile[] filesFTP = cliente.listFiles(source); 

clientFTP.changeWorkingDirectory(goal); // IMPORTANT change to final directory 

for (FTPFile f : archivosFTP) 
    { 
    if(f.isFile()) 
     { 
     cliente.rename(source+"/"+f.getName(), f.getName()); 
     } 
    } 
+0

यह बैकअप/फ़ाइल कॉपी नहीं करता है, यह एक फाइल चलाता है। यह सवाल नहीं है कि यह सवाल क्या है। –

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