• docker 部署vsftpd服务、验证及java ftp操作工具类


    docker部署vsftpd服务

    新建ftp文件存储目录/home/ftp

    cd /home
    mkdir ftp

    创建一个组,用于存放ftp用户

    groupadd ftpgroups

    创建ftp用户,并加入ftpgroups组

    useradd -d /home/ftp/ftptest -g ftpgroups ftptest

    设置密码

    passwd ftptest

    设置不允许用于用户登录

    usermod -s /sbin/nologin ftptest

    下载镜像

    docker pull fauria/vsftpd

    运行容器

    docker run -d -v /home/ftp:/home/vsftpd -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -e FTP_USER=ftptest -e FTP_PASS=ftptest --name vsftpd fauria/vsftpd
    

    验证

    安装ftp

    yum -y install ftp 

    1. 连接ftp服务器 
      格式:ftp [hostname| ip-address]
      a)在linux命令行下输入:ftp 192.168.26.66
      b)服务器询问你用户名和口令,分别输入用户名和相应密码,待认证通过即可。

    2. 下载文件

      下载文件通常用get和mget这两条命令。
      a) get 
      格式:get [remote-file] [local-file]
      将文件从远端主机中传送至本地主机中.
      如要获取服务器上e: ose1.bmp,则
      ftp> get /rose/1.bmp 1.bmp (回车)

      b) mget      
      格式:mget [remote-files]
      从远端主机接收一批文件至本地主机.
      如要获取服务器上e: ose下的所有文件,则
      ftp> cd /rose
      ftp> mget *.* (回车)

      注意:文件都下载到了linux主机的当前目录下。比如,在 /root/yint下运行的ftp命令,则文件都下载到了/root/yint 下。

    3.上传文件

      a) put
      格式:put local-file [remote-file]
      将本地一个文件传送至远端主机中.
      如要把本地的1.bmp传送到远端主机e: ose,并改名为333.bmp
      ftp> put 1.bmp /rose/333.bmp (回车)

      b) mput
      格式:mput local-files
      将本地主机中一批文件传送至远端主机.
      如要把本地当前目录下所有bmp文件上传到服务器e: ose 下
      ftp> cd /rose (回车)
      ftp> mput *.bmp (回车)
      注意:上传文件都来自于主机的当前目录下。比如,在 /root/test下运行的ftp命令,则只有在/root/test下的文件linux才会 上传到服务器e: ose 下。

    4. 断开连接
      bye:中断与服务器的连接。
      ftp> bye (回车)

    java ftp操作工具类

    maven依赖

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

    FtpUtils.java

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.MalformedURLException;
    
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    
    public class FtpUtils {
    	// ftp服务器地址
    	public String hostname = "172.19.4.4";
    	// ftp服务器端口号默认为21
    	public Integer port = 21;
    	// ftp登录账号
    	public String username = "ftptest";
    	// ftp登录密码
    	public String password = "ftptest";
    
    	public FTPClient ftpClient = null;
    
    	/**
    	 * 初始化ftp服务器
    	 */
    	public void initFtpClient() {
    		ftpClient = new FTPClient();
    		ftpClient.setControlEncoding("utf-8");
    		try {
    			System.out.println("connecting...ftp服务器:" + this.hostname + ":"
    					+ this.port);
    			ftpClient.connect(hostname, port); // 连接ftp服务器
    			ftpClient.login(username, password); // 登录ftp服务器
    			int replyCode = ftpClient.getReplyCode(); // 是否成功登录服务器
    			if (!FTPReply.isPositiveCompletion(replyCode)) {
    				System.out.println("connect failed...ftp服务器:" + this.hostname
    						+ ":" + this.port);
    			}
    			System.out.println("connect successfu...ftp服务器:" + this.hostname
    					+ ":" + this.port);
    		} catch (MalformedURLException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 上传文件
    	 * 
    	 * @param pathname
    	 *            ftp服务保存地址
    	 * @param fileName
    	 *            上传到ftp的文件名
    	 * @param originfilename
    	 *            待上传文件的名称(绝对地址) *
    	 * @return
    	 */
    	public boolean uploadFile(String pathname, String fileName,
    			String originfilename) {
    		boolean flag = false;
    		InputStream inputStream = null;
    		try {
    			System.out.println("开始上传文件");
    			inputStream = new FileInputStream(new File(originfilename));
    			initFtpClient();
    			ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
    			CreateDirecroty(pathname);
    			ftpClient.makeDirectory(pathname);
    			ftpClient.changeWorkingDirectory(pathname);
    			ftpClient.storeFile(fileName, inputStream);
    			inputStream.close();
    			ftpClient.logout();
    			flag = true;
    			System.out.println("上传文件成功");
    		} catch (Exception e) {
    			System.out.println("上传文件失败");
    			e.printStackTrace();
    		} finally {
    			if (ftpClient.isConnected()) {
    				try {
    					ftpClient.disconnect();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    			if (null != inputStream) {
    				try {
    					inputStream.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		return true;
    	}
    
    	/**
    	 * 上传文件
    	 * 
    	 * @param pathname
    	 *            ftp服务保存地址
    	 * @param fileName
    	 *            上传到ftp的文件名
    	 * @param inputStream
    	 *            输入文件流
    	 * @return
    	 */
    	public boolean uploadFile(String pathname, String fileName,
    			InputStream inputStream) {
    		boolean flag = false;
    		try {
    			System.out.println("开始上传文件");
    			initFtpClient();
    			ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
    			CreateDirecroty(pathname);
    			ftpClient.makeDirectory(pathname);
    			ftpClient.changeWorkingDirectory(pathname);
    			ftpClient.storeFile(fileName, inputStream);
    			inputStream.close();
    			ftpClient.logout();
    			flag = true;
    			System.out.println("上传文件成功");
    		} catch (Exception e) {
    			System.out.println("上传文件失败");
    			e.printStackTrace();
    		} finally {
    			if (ftpClient.isConnected()) {
    				try {
    					ftpClient.disconnect();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    			if (null != inputStream) {
    				try {
    					inputStream.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		return true;
    	}
    
    	// 改变目录路径
    	public boolean changeWorkingDirectory(String directory) {
    		boolean flag = true;
    		try {
    			flag = ftpClient.changeWorkingDirectory(directory);
    			if (flag) {
    				System.out.println("进入文件夹" + directory + " 成功!");
    
    			} else {
    				System.out.println("进入文件夹" + directory + " 失败!开始创建文件夹");
    			}
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		}
    		return flag;
    	}
    
    	// 创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
    	public boolean CreateDirecroty(String remote) throws IOException {
    		boolean success = true;
    		String directory = remote + "/";
    		// 如果远程目录不存在,则递归创建远程服务器目录
    		if (!directory.equalsIgnoreCase("/")
    				&& !changeWorkingDirectory(new String(directory))) {
    			int start = 0;
    			int end = 0;
    			if (directory.startsWith("/")) {
    				start = 1;
    			} else {
    				start = 0;
    			}
    			end = directory.indexOf("/", start);
    			String path = "";
    			String paths = "";
    			while (true) {
    				String subDirectory = new String(remote.substring(start, end)
    						.getBytes("GBK"), "iso-8859-1");
    				path = path + "/" + subDirectory;
    				if (!existFile(path)) {
    					if (makeDirectory(subDirectory)) {
    						changeWorkingDirectory(subDirectory);
    					} else {
    						System.out.println("创建目录[" + subDirectory + "]失败");
    						changeWorkingDirectory(subDirectory);
    					}
    				} else {
    					changeWorkingDirectory(subDirectory);
    				}
    
    				paths = paths + "/" + subDirectory;
    				start = end + 1;
    				end = directory.indexOf("/", start);
    				// 检查所有目录是否创建完毕
    				if (end <= start) {
    					break;
    				}
    			}
    		}
    		return success;
    	}
    
    	// 判断ftp服务器文件是否存在
    	public boolean existFile(String path) throws IOException {
    		boolean flag = false;
    		FTPFile[] ftpFileArr = ftpClient.listFiles(path);
    		if (ftpFileArr.length > 0) {
    			flag = true;
    		}
    		return flag;
    	}
    
    	// 创建目录
    	public boolean makeDirectory(String dir) {
    		boolean flag = true;
    		try {
    			flag = ftpClient.makeDirectory(dir);
    			if (flag) {
    				System.out.println("创建文件夹" + dir + " 成功!");
    
    			} else {
    				System.out.println("创建文件夹" + dir + " 失败!");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return flag;
    	}
    
    	/**
    	 * * 下载文件 *
    	 * 
    	 * @param pathname
    	 *            FTP服务器文件目录 *
    	 * @param filename
    	 *            文件名称 *
    	 * @param localpath
    	 *            下载后的文件路径 *
    	 * @return
    	 */
    	public boolean downloadFile(String pathname, String filename,
    			String localpath) {
    		boolean flag = false;
    		OutputStream os = null;
    		try {
    			System.out.println("开始下载文件");
    			initFtpClient();
    			// 切换FTP目录
    			ftpClient.changeWorkingDirectory(pathname);
    			FTPFile[] ftpFiles = ftpClient.listFiles();
    			for (FTPFile file : ftpFiles) {
    				if (filename.equalsIgnoreCase(file.getName())) {
    					File localFile = new File(localpath + "/" + file.getName());
    					os = new FileOutputStream(localFile);
    					ftpClient.retrieveFile(file.getName(), os);
    					os.close();
    				}
    			}
    			ftpClient.logout();
    			flag = true;
    			System.out.println("下载文件成功");
    		} catch (Exception e) {
    			System.out.println("下载文件失败");
    			e.printStackTrace();
    		} finally {
    			if (ftpClient.isConnected()) {
    				try {
    					ftpClient.disconnect();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    			if (null != os) {
    				try {
    					os.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		return flag;
    	}
    
    	/**
    	 * * 删除文件 *
    	 * 
    	 * @param pathname
    	 *            FTP服务器保存目录 *
    	 * @param filename
    	 *            要删除的文件名称 *
    	 * @return
    	 */
    	public boolean deleteFile(String pathname, String filename) {
    		boolean flag = false;
    		try {
    			System.out.println("开始删除文件");
    			initFtpClient();
    			// 切换FTP目录
    			ftpClient.changeWorkingDirectory(pathname);
    			ftpClient.dele(filename);
    			ftpClient.logout();
    			flag = true;
    			System.out.println("删除文件成功");
    		} catch (Exception e) {
    			System.out.println("删除文件失败");
    			e.printStackTrace();
    		} finally {
    			if (ftpClient.isConnected()) {
    				try {
    					ftpClient.disconnect();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		return flag;
    	}
    
    	public static void main(String[] args) {
    		FtpUtils ftp = new FtpUtils();
    		 ftp.uploadFile("", "4.txt", "F://2.txt");
    		// ftp.downloadFile("ftpFile/data", "123.docx", "F://");
    		//ftp.deleteFile("ftpFile/data", "123.docx");
    		System.out.println("ok");
    	}
    }
  • 相关阅读:
    匿名对象
    JAVA中的方法重载 (参数个数不同,顺序不同,类型不同)
    构造方法的返回值和void 的区别
    一些小算法技巧
    Java基础总结(一)
    Struts2 Intercepter 笔记
    js Dom 编程
    The Bug and Exception of Hibernate
    包--R In Action
    --三种方法查询人所在部门平均工资
  • 原文地址:https://www.cnblogs.com/gmhappy/p/11864100.html
Copyright © 2020-2023  润新知