2012-06-26 19 views
10

Używam Apache Commons FTP, aby przesłać plik. Przed przesłaniem chcę sprawdzić, czy plik już istnieje na serwerze i wykonać z niego kopię zapasową do katalogu kopii zapasowych na tym samym serwerze.Jak skopiować plik na serwerze ftp do katalogu na tym samym serwerze w java?

Czy ktoś wie, jak skopiować plik z serwera FTP do katalogu kopii zapasowych na tym samym serwerze?

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

} 

Zmieniano Kod: nadal istnieje problem, kiedy kopia zapasowa pliku zip, plik kopii zapasowej-ED jest uszkodzony.

Czy jakiekolwiek ciało zna przyczynę?

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

czego nie zrozumiałeś? jeśli znasz ścieżkę źródłową i ścieżkę distanation, możesz otworzyć plik do odczytu (z buforami) i napisać na ścieżce distanation. możesz także użyć specyficznego dla OS api do kopiowania plików. –

+0

Typ pliku to FTPFile. jak mogę odczytać i zapisać w buforze? oznacza: 'FileInputStream in = new FileInputStream (plik);' – itro

+0

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

Odpowiedz

16

Jeśli używasz Apache Commons netto FTPClient, istnieje bezpośredni sposób przenieść plik z jednej lokalizacji do innej lokalizacji (jeśli user posiada odpowiednie uprawnienia).

ftpClient.rename(from, to); 

lub, jeśli jesteś zaznajomiony z ftp commands, można użyć coś jak

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

Jeśli używasz innego klienta przejść dokumentacji Tam przyzwyczajenie się wiele zmian między wdrożeń klienckich.

UPDATE:

Powyższe podejście przenosi plik do katalogu to, tj, plik nie będzie tam już w from katalogu. Zasadniczo protokół ftp przeznaczony jest do przesyłania plików z local <-> remote lub remote <-> other remote, ale nie do przesyłania z serwerem.

Praca tutaj będzie łatwiejsza, pobierz kompletny plik lokalny InputStream i zapisz go na serwerze jako nowy plik w katalogu zapasowym.

aby uzyskać pełną dokumentację,

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

teraz, przechowywać ten strumień do katalogu kopii zapasowych. Najpierw musimy zmienić katalog roboczy na katalog kopii zapasowych.

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

Nadzieja to pomaga ..

+1

Za pomocą twojego rozwiązania 'ftpClient.rename (od, do);' mogę zmienić jego nazwę, ale nadal pozostaje w tym samym katalogu, a nie w jednym, którego oczekiwałem (katalog kopii zapasowych). Jak mogę to rozwiązać? Jak mogę uzyskać ścieżkę kopii zapasowej? jaka jest właściwa ścieżka do drugiego argumentu, jeśli chcę, aby plik był kopiowany do katalogu buckup? Mam katalog główny, w którym znajdują się wszystkie pliki i katalog kopii zapasowych, które utworzę w katalogu głównym. – itro

+0

coś w stylu 'ftpClient.rename ("/root/your_file.txt "," /root/backup/your_file_bak.txt ");'. Należy tutaj zwrócić uwagę na ruchy z katalogu 'from' do katalogu' do'. Nie będziesz już tego mieć w katalogu 'from'. –

+0

ohhhhhhhhh nie, chcę mieć tylko kopię, nie przesuwając go do kopii zapasowej. – itro

1

Spróbuj w ten sposób,

używam biblioteki Apache.

ftpClient.rename (od, do) będzie łatwiej, mam wymienione w kodzie poniżej gdzie dodać ftpClient.rename (od do).

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

// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Dodaj kopię zapasową Tutaj $$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ //

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

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

// $$$$$$$$$$$$$$$ $$$$$$$$$$$$$ Dodaj kopię zapasową Tutaj $$$$$$$$$$$$$$$$$$$$$$$$$$$ //

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

    } 
+0

Powinienem sprawdzić, czy plik istnieje w serwerze, a następnie wykonać kopię zapasową, a następnie przesłać plik. myślę, że zrobiłeś tu coś innego – itro

+0

Przyjrzyj się temu poprawnie, jeśli (wynik) jest blokiem, który wykona się po pomyślnym zapisaniu pliku na serwerze ..... –

-1

celu podtrzymania przy samej Server (ruchu), można użyć:

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

To nie tworzy kopii/kopii pliku, to przenosi plik. Nie o to chodzi w tym pytaniu. –

Powiązane problemy