如何使用Java将FTP服务器上的文件复制到同一服务器上的目录中?

我正在使用Apache Commons 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文件时,备份的文件已损坏。

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

}

}

回答:

如果您使用的是apache commons net

FTPClient,则有一种直接方法将文件从一个位置移动到另一位置(如果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.

}

如果您使用任何其他客户端,请阅读文档,客户端实现之间不会有太大变化。

上面的方法将文件移动到to目录,即文件from不再在目录中。基本上ftp协议意味着要从服务器中传输文件local <->

remote或从remote <-> other remote服务器中不传输文件。

解决此问题的方法会更简单,将完整文件获取到本地,InputStream然后将其作为备份目录中的新文件写回到服务器。

获取完整的文件,

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

ftpClient.retrieveFile(fileName, outputStream);

InputStream is = new ByteArrayInputStream(outputStream.toByteArray());

现在,将此流存储到备份目录。首先,我们需要将工作目录更改为备份目录。

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

希望这对您有帮助。

以上是 如何使用Java将FTP服务器上的文件复制到同一服务器上的目录中? 的全部内容, 来源链接: utcz.com/qa/434229.html

回到顶部