Comment copier un fichier sur le serveur FTP vers un répertoire sur le même serveur en java?
Je suis en utilisant Apache Commons FTP pour télécharger un fichier. Avant le téléchargement, je veux vérifier si le fichier existe déjà sur le serveur et faire une sauvegarde depuis un répertoire de sauvegarde sur le même serveur.
Personne ne sait comment faire pour copier un fichier à partir d'un serveur ftp dans un répertoire de sauvegarde sur le même serveur?
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();
}
}
Édité code: il y a encore un problème, lorsque je fichier zip de sauvegarde, la sauvegarde-de fichier est corrompu.
N'importe quel corps de connaître la raison de cela?
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();
}
}
source d'informationauteur itro
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez apache commons net
FTPClient
il existe une méthode pour déplacer un fichier d'un emplacement à un autre endroit (si leuser
dispose des autorisations appropriées).ou, Si vous êtes familier avec
ftp commands
vous pouvez utiliser quelque chose commeSi vous utilisez un autre client, passez à la documentation, Il n'y aura pas beaucoup de changement entre l'implémentation du client.
Mise à JOUR:
Approche ci-dessus déplace le fichier vers
to
répertoire, j'.e, le fichier ne sera pas là dansfrom
répertoire plus. Fondamentalement, ftp protocole destiné à être transférer les fichiers delocal <-> remote
ouremote <-> other remote
mais pas de transfert avec le serveur.Le travail autour d'ici, serait plus simple, obtenir le dossier complet à un local
InputStream
et d'écrire à nouveau sur le serveur en tant que nouveau fichier dans le dos de répertoire.pour obtenir le dossier complet,
maintenant, magasin de flux de répertoire de sauvegarde. Nous avons besoin d'abord de changer de répertoire de travail de répertoire de sauvegarde.
Espère que cela vous aide..
Essayer de cette façon,
Je suis en utilisant apache bibliothèque .
ftpClient.renommer(de, à) sera plus facile, je l'ai mentionné dans le code ci-dessous
où ajouter ftpClient.renommer(de,à).
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Ajouter la sauvegarde Ici$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Ajouter la sauvegarde Ici$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
De sauvegarde au même Serveur (se déplacer), pouvez-vous utiliser: