2012-06-26 254 views
10

estoy usando Apache Commons FTP para subir un archivo. Antes de subir, deseo verificar si el archivo ya existe en el servidor y hacer una copia de seguridad de él en un directorio de respaldo en el mismo servidor.¿Cómo copiar un archivo en el servidor ftp a un directorio en el mismo servidor en Java?

¿Alguien sabe cómo copiar un archivo desde un servidor FTP a un directorio de copia de seguridad en el mismo servidor?

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

} 

código Editado: todavía hay un problema, cuando me archivo zip de copia de seguridad, el archivo de copia de seguridad de opinión está dañado.

¿Tiene algún cuerpo sabe la razón para ello?

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

¿Qué no entendiste? si conoce la ruta de origen y la ruta de distancia, solo puede abrir el archivo para lectura (con almacenamientos intermedios) y escribir en la ruta de distanciamiento. también puede usar una API específica para archivos de afrontamiento. –

+0

El tipo de archivo es FTPFile. ¿Cómo puedo leer y escribir en buffer? ¿te refieres a 'FileInputStream in = new FileInputStream (archivo);' – itro

+0

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

Respuesta

16

Si está utilizando apache commons neta FTPClient, hay un método directo para mover un archivo de una ubicación a otra ubicación (si el user tiene permisos adecuados).

ftpClient.rename(from, to); 

o, si usted está familiarizado con ftp commands, se puede usar algo como

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

Si está utilizando cualquier otro cliente, vaya a través de la documentación, No habrá muchos cambios entre implementaciones de clientes.

ACTUALIZACIÓN:

Por encima de enfoque se mueve el archivo a to directorio, es decir, el archivo no estará allí en from directorio más. Básicamente protocolo FTP destinado a ser transferir los archivos desde local <-> remote o remote <-> other remote pero no para transferir con en el servidor.

El trabajo aquí, sería más simple, obtenga el archivo completo en un InputStream local y escríbalo de nuevo en el servidor como un nuevo archivo en el directorio de respaldo.

para obtener el archivo completo,

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

ahora, tienda de esta corriente al directorio de copia de seguridad. Primero tenemos que cambiar el directorio de trabajo al directorio de respaldo.

// 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 esto le ayuda ..

+1

Con su solución 'ftpClient.rename (from, to);' puedo cambiarle el nombre, pero aún permanece en el mismo directorio, no en el que esperaba (directorio de copia de seguridad). ¿Cómo puedo resolverlo? ¿Cómo puedo obtener una ruta de respaldo? ¿Cuál es el camino correcto para el segundo argumento si quiero que el archivo se copie en el directorio de buckup? Tengo el directorio raíz que contiene todos los archivos y el directorio de respaldo que creé en el directorio raíz. – itro

+0

algo como 'ftpClient.rename ("/root/your_file.txt "," /root/backup/your_file_bak.txt ");'. Una cosa a tener en cuenta aquí es que se mueve desde el directorio 'from' al directorio' to'. Ya no lo tendrá en el directorio 'de '. –

+0

ohhhhhhhhh no, quiero tener solo una copia para que no se mueva a la copia de seguridad. – itro

1

probar este modo,

estoy usando la biblioteca de Apache.

ftpClient.rename (de, a) hará que sea más fácil, he mencionado en el código de abajo para agregar donde ftpClient.rename (de, 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"); 

// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Añadir la copia de seguridad Aquí $$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ //

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

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

// $$$$$$$$$$$$$$$ $$$$$$$$$$$$$$ Agregue la copia de seguridad aquí $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //

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

    } 
+0

Debo verificar si el archivo existe en el servidor, luego hacer una copia de seguridad y luego subir el archivo. Creo que hiciste aquí algo más – itro

+0

Míralo correctamente una vez más, si (resultado) es el bloque que se ejecutará después de que el archivo se haya almacenado correctamente en el servidor ..... –

-1

Para copia de seguridad en el mismo servidor (mover), se puede utilizar:

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

Esto no hace copia de seguridad/copia de un archivo, mueve un archivo. De eso no se trata esta pregunta. –

Cuestiones relacionadas