2012-06-26 5 views
10

Ich verwende Apache Commons FTP, um eine Datei hochzuladen. Vor dem Hochladen möchte ich prüfen, ob die Datei bereits auf dem Server existiert und eine Sicherungskopie davon in ein Backup-Verzeichnis auf demselben Server erstellen.Wie kopiere ich eine Datei auf dem FTP-Server in ein Verzeichnis auf dem gleichen Server in Java?

Kann jemand eine Datei von einem FTP-Server in ein Backup-Verzeichnis auf dem gleichen Server kopieren?

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(); 
    } 

} 

Edited Code: noch gibt es ein Problem, wenn ich ein Backup ZIP-Datei, die Backup-ed-Datei beschädigt ist.

Kennt jemand den Grund dafür?

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

was hast du nicht verstanden? Wenn Sie den Quellpfad und den Distanationspfad kennen, können Sie die Datei nur zum Lesen (mit Puffern) öffnen und auf den Distanationspfad schreiben. Sie können auch os spezifische API für die Bearbeitung von Dateien verwenden. –

+0

Der Dateityp ist FTPFile. Wie kann ich im Puffer lesen und schreiben? meinst du wie 'FileInputStream in = neuer FileInputStream (Datei);' – itro

+0

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

Antwort

16

Wenn Sie Apache Commons net FTPClient verwenden, gibt es eine direkte Methode, eine Datei von einem Ort an einen anderen Ort zu bewegen (wenn die user richtigen Berechtigungen hat).

ftpClient.rename(from, to); 

oder, wenn Sie mit ftp commands vertraut sind, können Sie so etwas wie

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

Wenn Sie einen anderen Client verwenden, gehen Sie durch die Dokumentation verwenden, gibt viele Änderungen zwischen Client-Implementierungen sein würde nicht.

UPDATE:

Above Ansatz verschiebt die Datei in to Verzeichnis, das heißt, wird die Datei nicht da sein mehr in from Verzeichnis. Grundsätzlich FTP-Protokoll soll die Dateien von local <-> remote oder remote <-> other remote übertragen, aber nicht mit in den Server übertragen werden.

Die Arbeit hier wäre einfacher, holen Sie die vollständige Datei zu einem lokalen InputStream und schreiben Sie es zurück auf den Server als eine neue Datei im Backup-Verzeichnis.

die komplette Datei zu erhalten,

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

jetzt, zu speichern, diesen Strom zu Backup-Verzeichnis. Zuerst müssen wir das Arbeitsverzeichnis in das Sicherungsverzeichnis ändern.

// 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 

Hope this Sie hilft ..

+1

Mit Ihrer Lösung 'ftpClient.rename (from, to);' kann ich es umbenennen, aber bleibt immer noch im selben Verzeichnis, nicht zu dem, was ich erwarte (Backup-Verzeichnis). Wie kann ich es lösen? Wie kann ich Backup-Pfad erhalten? Was ist der richtige Pfad für das zweite Argument, wenn die Datei in das Buckup-Verzeichnis kopiert werden soll? Ich habe Root-Verzeichnis, das alle Dateien dort und Backup-Verzeichnis, das ich es unter dem Stammverzeichnis erstellen. – itro

+0

etwas wie 'ftpClient.rename ("/root/your_file.txt "," /root/backup/your_file_bak.txt ");'. Eine Sache, die hier zu beachten ist, ist, dass sie sich vom Verzeichnis 'from' in das Verzeichnis' to' bewegt. Sie werden es nicht mehr im 'from'-Verzeichnis haben. –

+0

ohhhhhhhhh nein ich möchte nur eine Kopie davon haben, die es nicht zum Backup verschiebt. – itro

1

auf diese Weise versuchen,

ich Apache Bibliothek verwenden.

ftpClient.rename (von, bis) wird es einfacher, ich habe unten in dem Code erwähnt, wo ftpClient.rename (von, bis) hinzuzufügen.

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"); 

// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ die Backup hinzufügen Hier $$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ //

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

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

// $$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$ Fügen Sie die Unterstützung hier hinzu $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //

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

    } 
+0

Ich sollte prüfen, ob die Datei im Server vorhanden ist, dann erstellen Sie die Sicherung und laden Sie die Datei hoch. ich denke du hast hier noch etwas anderes – itro

+0

Schau es dir nochmal richtig an, ob (result) der Block ist der ausgeführt wird nachdem die Datei erfolgreich auf dem Server gespeichert wurde ..... –

-1

Um ein Backup auf demselben Server (move), können Sie verwenden:

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

Dies sichert/kopiert keine Datei, es verschiebt eine Datei. Darum geht es in dieser Frage nicht. –

Verwandte Themen