2012-06-26 35 views
10

Apache Commons FTPを使用してファイルをアップロードしています。アップロードする前に、そのファイルがすでにサーバー上に存在するかどうかをチェックし、そのサーバーから同じサーバー上のバックアップディレクトリにバックアップを作成する必要があります。ftpサーバ上のファイルをjavaの同じサーバ上のディレクトリにコピーする方法は?

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

} 

編集コード:はまだ私のバックアップzipファイル、バックアップ-EDファイルが破損している問題があります。

身体にはその理由が分かりますか?

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

あなたは何を理解していませんか?もしあなたがソースパスとDistanationパスを知っていれば、読み込み(バッファ付きで)ファイルを開き、distentionパスに書き込むことができます。また、osの特定のapiを使ってファイルに対処することもできます。 –

+0

ファイルタイプはFTPFileです。どのように私はバッファに読み書きできますか? あなたは 'FileInputStream in = new FileInputStream(file);のような意味ですか? – itro

+0

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

答えて

16

あなたはFTPClientネットapacheのコモンズを使用している場合は、(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. 
} 

のようなものを使用することができます。

UPDATE:アプローチ上記

toディレクトリ、すなわちにファイルを移動し、ファイルはもうfromディレクトリには存在しません。基本的にftpプロトコルは、ファイルをlocal <-> remoteまたはremote <-> other remoteから転送することを意図していましたが、サーバに転送することはできません。

この問題を回避するには、完全なファイルをローカルのInputStreamに取得し、バックアップディレクトリに新しいファイルとしてサーバーに書き戻します。

バックアップディレクトリにこのストリームを格納し、完全なファイル、今

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

を取得します。まず、作業ディレクトリをバックアップディレクトリに変更する必要があります。これは、私は、Apacheのライブラリを使用していますが、この方法を試してみてください。..

+1

あなたのソリューション 'ftpClient.rename(from、to);'私はそれを名前を変更することができますが、私は期待していない(バックアップディレクトリ)と同じディレクトリにとどまっています。 どうすれば解決できますか?バックアップパスを取得するにはどうすればよいですか?ファイルをバックアップディレクトリにコピーしたい場合、第2引数の正しいパスは何ですか? 私はそこにある全てのファイルとルートディレクトリの下に作成するバックアップディレクトリを持っています。 – itro

+0

'ftpClient.rename("/root/your_file.txt "、" /root/backup/your_file_bak.txt ");'のようなものです。ここで注意すべき点の1つは、 'from'ディレクトリから' to'ディレクトリに移動することです。あなたは 'from'ディレクトリにこれ以上所持しません。 –

+0

ohhhhhhhhhいいえ、私はそれをバックアップに移動しないだけのコピーを持っていたいです。 – itro

1

を助け

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

希望。

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

これは、ファイルをバックアップ/コピーしない、ファイルを移動します。それはこの質問についてではありません。 –

関連する問題