2012-06-26 16 views
10

Sto usando Apache Commons FTP per caricare un file. Prima di caricare voglio verificare se il file esiste già sul server e fare un backup da esso a una directory di backup sullo stesso server.Come copiare un file sul server ftp in una directory sullo stesso server in java?

Qualcuno sa come copiare un file da un server ftp in una directory di backup sullo stesso server?

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

} 

Codice Modificato: ancora c'è un problema, quando ho file zip di backup, il file di backup-ed è danneggiato.

Qualcuno ne conosce il motivo?

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

cosa non hai capito? se si conosce il percorso di origine e il percorso di distanazione, è sufficiente aprire il file per la lettura (con i buffer) e scrivere sul percorso di distanazione. inoltre puoi usare os specifica di os per copiare i file. –

+0

Il tipo di file è FTPFile. come posso leggere e scrivere nel buffer? significa "FileInputStream in = nuovo FileInputStream (file);" – itro

+0

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

risposta

16

Se si utilizza comuni apache net FTPClient, c'è un metodo diretto per spostare un file da una posizione a un'altra posizione (se il user dispone di autorizzazioni appropriate).

ftpClient.rename(from, to); 

o, se si ha familiarità con ftp commands, si può usare qualcosa di simile

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

Se si utilizza qualsiasi altro client, passa attraverso la documentazione, non ci sarà cambia molto tra le implementazioni dei clienti.

UPDATE:

Sopra approccio sposta il file to directory, cioè, il file non sarà lì in from directory più. In pratica il protocollo ftp intendeva trasferire i file da local <-> remote o remote <-> other remote ma non trasferirli con nel server.

Il lavoro da queste parti, sarebbe più semplice, ottenere il file completo in un locale InputStream e riscriverlo sul server come nuovo file nella directory di backup.

per ottenere il file completo,

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

ora, negozio di questo flusso di directory di backup. Per prima cosa dobbiamo cambiare la directory di lavoro nella directory di backup.

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

Spero che questo aiuti voi ..

+1

Con la soluzione 'ftpClient.rename (da, a);' posso rinominarlo ma rimane nella stessa directory non a quello che mi aspettavo (directory di backup). Come posso risolverlo? Come posso ottenere il percorso di backup? qual è il percorso giusto per il secondo argomento se voglio che il file venga copiato nella directory buckup? Ho una directory root con tutti i file situati lì e una directory di backup che la creo sotto la directory root. – itro

+0

qualcosa come 'ftpClient.rename ("/root/your_file.txt "," /root/backup/your_file_bak.txt ");'. Una cosa da notare qui è che si sposta dalla directory 'from' a' to'. Non lo troverai più nella directory 'from'. –

+0

ohhhhhhhhh no voglio solo avere una copia di esso non spostandolo al backup. – itro

1

provare in questo modo,

Sto usando la biblioteca di apache.

ftpClient.rename (da, a) renderà più facile, ho menzionato nel seguente codice cui aggiungere ftpClient.rename (da, a).

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

// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Aggiungere il backup Qui $$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ //

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

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

// $$$$$$$$$$$$$$$ $$$$$$$$$$$$$$ Aggiungi il backup qui $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //

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

    } 
+0

Dovrei controllare se il file esiste nel server, quindi fare il backup e quindi caricare il file. penso che tu abbia fatto qualcos'altro – itro

+0

Guardalo bene ancora una volta, se (risultato) è il blocco che verrà eseguito dopo che il file è stato memorizzato con successo sul server ..... –

-1

Per eseguire il backup allo stesso server (movimento), è possibile utilizzare:

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

Questo non fa il backup/copia un file, sposta un file. Non è di questa domanda. –