结构:
FTP采用C/S(客户端/服务端)结构
端口:
通常默认使用TCP端口中的 20和21这两个端口
20传输数据,21传输控制信息
用户使用支持FTP协议的客户端,连接到在远程主机上的FTP服务端程。用户通过客户端向服务端发出命令,服务端就会执行用户所发出的命令,然后将执行的结果返回到客户端。
yum -y install vsftpd
可以不关,不关就可以不输入用户名密码直接访问
vim /etc/vsftpd/vsftpd.conf

systemctl start vsftpd.service
systemctl status vsftpd.service

systemctl disable firewalld
- adduser ftpuser #创建账号
- passwd ftpuser #设定密码
-
通过本地文件夹 ftp://ip 进行访问

![]()
添加对应的依赖
- <!-- ftp上传-->
- <dependency>
- <groupId>commons-net</groupId>
- <artifactId>commons-net</artifactId>
- <version>3.8.0</version>
- </dependency>
-
- /**
- * @param url FTP服务器hostname
- * @param port FTP服务器端口
- * @param username FTP登录账号
- * @param password FTP登录密码
- * @param path FTP服务器保存目录
- * @param filename 文件名 6403_APP_YYYYMMDD_渠道标志_批次号.txt
- * @param inputStream 输入流
- * @return
- */
- private static boolean uploadFileFTP(String url, int port, String username, String password,
- String path, String filename, InputStream inputStream) {
-
-
- boolean success;
- FTPClient ftp = new FTPClient();
- try {
- int reply;
- // 链接 FTP 服务器
- // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
- ftp.setConnectTimeout(10000*10000);
- ftp.connect(url);
- // 登录
- ftp.login(username, password);
- // 返回链接码
- reply = ftp.getReplyCode();
- // 设置文件格式为二进制类型
- if (!FTPReply.isPositiveCompletion(reply)) {
- ftp.disconnect();
- log.info("FTP服务器 拒绝连接");
- return false;
- }
- ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
- ftp.makeDirectory(path);
- // 跳转到指定的目录路径
- ftp.changeWorkingDirectory(path);
- ftp.enterLocalPassiveMode();
- // 存储文件
- ftp.storeFile(filename, inputStream);
- inputStream.close();
- ftp.logout();
- success = true;
- } catch (IOException e) {
- log.error("FTP服务器 文件上传失败 失败原因:{}", e.getMessage(), e);
- return false;
- } finally {
- if (ftp.isConnected()) {
- try {
- ftp.disconnect();
- } catch (IOException e) {
- log.error("FTP服务器 关闭失败 失败原因:{}", e.getMessage(), e);
- }
- }
- }
- return success;
- }
- @RequestMapping("/addUser")
- public Object addUser(@RequestParam("headPic")MultipartFile file) throws IOException {
-
- InputStream inputStream = file.getInputStream(); //获取上传的文件流
- String filename = file.getOriginalFilename();//获取上传的文件名
- String suffix = filename.substring(filename.lastIndexOf("."));//获取后缀
- String fileName = UUID.randomUUID().toString()+suffix; //定义一个不重复的名字
- boolean b = uploadFileFTP("0.0.0.0", 21, "ftpuser", "ftpuser", "/root/tomcat/apache-tomcat-8.5.81/webapps/yuansheng", fileName, inputStream);
- return b;
- }
使用postman进行测试:
上传文件进行测试

一般都会存在用户目录下:
如果不是用户的目录下地址,则自动会存入用户下。(只会跑到用户目录下存储)
