English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное описание кода передачи файлов ftp с использованием библиотеки Apache на java

Эта статьяmainly介绍了如何使用Apache-инструментовый наборcommons-net提供的ftp-инструмент для загрузки и загрузки файлов на ftp-сервер.

1. Подготовка

Необходимо ссылаться на пакет commons-net-3.5.jar.

Использование Maven для импорта:

<dependency>
  <groupId>commons-net</groupId>
  <artifactId>commons-net</artifactId>
  <version>3.5</version>
</dependency>

Ручная загрузка:

https://ru.oldtoolbag.com/softs/550085.html

Двое. Подключение к FTP Server

/**
   * Подключение к FTP Server
   * @throws IOException
   */
public static final String ANONYMOUS_USER="anonymous";
private FTPClient connect(){
	FTPClient client = new FTPClient();
	try {
		//Подключение к FTP Server
		client.connect(this.host, this.port);
		//Аутентификация
		if(this.user==null||"".equals(this.user)){
			//Использование аутентификации без пароля
			client.login(ANONYMOUS_USER, ANONYMOUS_USER);
		} else {
			client.login(this.user, this.password);
		}
		//Настройка формата файла
		client.setFileType(FTPClient.BINARY_FILE_TYPE);
		//Получение ответа FTP Server
		int reply = client.getReplyCode();
		if(!FTPReply.isPositiveCompletion(reply)){
			client.disconnect();
			return null;
		}
		//Перемещение в рабочую директорию
		changeWorkingDirectory(client);
		System.out.println("===Подключение к FTP: " + host + ":" + port);
	}
	catch(IOException e) {
		return null;
	}
	return client;
}
/**
   * Перемещение в рабочую директорию, создание директории, если удаленная директория не существует
   * @param client
   * @throws IOException
   */
private void changeWorkingDirectory(FTPClient client) throws IOException{
	if(this.ftpPath!=null&&!"".equals(this.ftpPath)){
		Boolean ok = client.changeWorkingDirectory(this.ftpPath);
		if(!ok){
			// ftpPath не существует, создается вручную
			StringTokenizer token = new StringTokenizer(this.ftpPath,"\\//");
			while(token.hasMoreTokens()){
				String path = token.nextToken();
				client.makeDirectory(path);
				client.changeWorkingDirectory(path);
			}
		}
	}
}
/**
   * Разорвать FTP-соединение
   * @param ftpClient
   * @throws IOException
   */
public void close(FTPClient ftpClient) throws IOException{
	if(ftpClient!=null && ftpClient.isConnected()){
		ftpClient.logout();
		ftpClient.disconnect();
	}
	System.out.println("!!! Разорвать FTP-соединение: " + host + ":" + port);
}

host: IP-адрес сервера ftp
port: Порт сервера ftp
user: Пользователь для входа
password: Пароль для входа
Если пользователь не указан, используется анонимный пользователь для входа.
ftpPath: Путь ftp, если путь ftp не существует, он автоматически создается. Если структура многоуровневых каталогов, необходимо итеративно создавать каталоги.

Третий раздел: Загрузка файла

/**
   * Загрузка файла
   * @param targetName Название файла для загрузки на ftp
   * @param localFile Путь к локальному файлу
   * @return
   */
public Boolean upload(String targetName,String localFile){
	//连接ftp server
	FTPClient ftpClient = connect();
	if(ftpClient==null){
		System.out.println("连接FTP服务器["+host+":"+port+"]失败!");
		return false;
	}
	File file = new File(localFile);
	//设置上传后文件名
	if(targetName==null||"".equals(targetName))
	      targetName = file.getName();
	FileInputStream fis = null;
	try {
		long now = System.currentTimeMillis();
		//Начало загрузки файла
		fis = new FileInputStream(file);
		System.out.println(">>>Начало загрузки файла:"+file.getName());
		Boolean ok = ftpClient.storeFile(targetName, fis);
		if (ok) {
			//Успешная загрузка
			long times = System.currentTimeMillis() - now;
			System.out.println(String.format(">>>Успешная загрузка: размер:%s, время загрузки:%d секунд", formatSize(file.length()), times/1000));
		} else//Ошибка загрузки
		System.out.println(String.format(">>>Ошибка загрузки: размер:%s", formatSize(file.length())));
	}
	catch(IOException e) {
		System.err.println(String.format(">>>Ошибка загрузки: размер:%s", formatSize(file.length())));
		e.printStackTrace();
		return false;
	}
	finally {
		try {
			if(fis!=null)
			          fis.close();
			close(ftpClient);
		}
		catch(Exception e) {
		}
	}
	return true;
}

Четыре, загрузка файлов

/**
   * Загрузка файлов
   * @param localPath местоположение на диске
   * @return
   */
public int download(String localPath){
	// 连接ftp server
	FTPClient ftpClient = connect();
	if(ftpClient==null){
		System.out.println("连接FTP服务器["+host+":"+port+"]失败!");
		return 0;
	}
	File dir = new File(localPath);
	if(!dir.exists())
	      dir.mkdirs();
	FTPFile[] ftpFiles = null;
	try {
		ftpFiles = ftpClient.listFiles();
		if(ftpFiles==null||ftpFiles.length==0)
		        return 0;
	}
	catch(IOException e) {
		return 0;
	}
	int c = 0;
	for (int i=0;i<ftpFiles.length;i++){
		FileOutputStream fos = null;
		try {
			String name = ftpFiles[i].getName();
			fos = new FileOutputStream(new File(dir.getAbsolutePath() + File.separator + name));
			System.out.println("<<<Начало загрузки файла: " + name);
			long now = System.currentTimeMillis();
			Boolean ok = ftpClient.retrieveFile(new String(name.getBytes("UTF-8"),"ISO-8859-1"), fos);
			if (ok) {
				//Успешная загрузка
				long times = System.currentTimeMillis() - now;
				System.out.println(String.format("<<<Успешная загрузка: размер:%s, время загрузки:%d секунд", formatSize(ftpFiles[i].getSize()), times/1000));
				c++;
			} else {
				System.out.println("<<<Неудачная загрузка");
			}
		}
		catch(IOException e) {
			System.err.println("<<<Неудачная загрузка");
			e.printStackTrace();
		}
		finally {
			try {
				if (fos != null)
				            fos.close();
				close(ftpClient);
			}
			catch(Exception e) {
			}
		}
	}
	return c;
}

Форматирование размера файла

private static final DecimalFormat DF = new DecimalFormat("#.##");
  /**
   * Форматирование размера файла (B, KB, MB, GB)
   * @param size
   * @return
   */
  private String formatSize(long size) {
    if (size < 1024) {
      return size + " B";
    } else if (size < 1024*1024) {
      return size/1024 + " KB";
    } else if (size < 1024*1024*1024) {
      return (size/(1024*1024)) + " MB";
    }else{}}
      double gb = size/(1024*1024*1024);
      return DF.format(gb)+" GB";
    }
  }

五、测试

public static void main(String args[]){
    FTPTest ftp = new FTPTest("192.168.1.10",21,null,null,"/temp/2016/12");
    ftp.upload("newFile.rar", "D:/ftp/TeamViewerPortable.rar");
    System.out.println("");
    ftp.download("D:/ftp/");
  }

结果

===连接到FTP:192.168.1.10:21
>>>开始上传文件:TeamViewerPortable.rar
>>>上传成功:大小:5 MB,上传时间:3秒
!!!断开FTP连接:192.168.1.10:21
===连接到FTP:192.168.1.10:21
<<<开始下载文件:newFile.rar
<<<下载成功:大小:5 MB,上传时间:4秒
!!!断开FTP连接:192.168.1.10:21

总结

以上就是本文关于java使用Apache工具集实现ftp文件传输代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

Дополнительные предложения