1. 服务器安装ftp服务
1.1 Linux 安装ftp服务器
yum -y install vsftpd
(离线安装 ——见 文末 )
关闭SELINUX /// 非必要项
修改/etc/selinux/config文件,把SELINUX参数的值改为disabled。
SELINUX =disabled
启动vsftpd服务
ftp服务器的服务名是vsftpd,相关的操作如下:
systemctl start vsftpd # 启动服务。
systemctl stop vsftpd # 停止服务。
systemctl restart vsftpd # 重启服务。
systemctl status vsftpd # 查看服务状态。
systemctl enable vsftpd # 启用开机自动动vsftpd服务。
systemctl disable vsftpd # 禁用开机自动动vsftpd服务
1.2 新建账户,root 被限制
创建用户:
useradd ftpuser
设置密码:
passwd ftpuser
密码:Userftp@123
2. 创建文件目录
创建目录
mkdir /home/ftpuser/ftpfile
赋权
1、先对用户所属的的组赋权限:
chown -R 用户名:用户组 目录
sudo chown -R ftpuser:ftpuser /home/ftpuser/ftpfile/
2、再对目录赋予权限:
chmod -R 775 目录
chmod -R 755 /home/ftpuser/ftpfile
3、查看文件夹的权限
ls -la 目录
ll
3.ftp配置 PASV 模式
配置文件位置 : /etc/vsftpd/vsftpd.conf
#连接端口 默认21
listen_port=2121
#PASV模式
pasv_enable=YES
# 端口范围 20-30个
pasv_min_port=2122
pasv_max_port=2142
#限制在目录
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/user_list
local_root=/home/ftpuser/ftpfile/
#禁止匿名访问
anonymous_enable=YES
# 问题 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
#允许用户在chroot环境中创建或修改文件
allow_writeable_chroot=YES
4. 防火墙开放端口
systemctl status firewalld
firewall-cmd --zone=public --add-port=2121-2142/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --list-ports
systemctl start firewalld
5. 连接测试
# 下载文件
curl -u yourusername:yourpassword ftp://ftp.example.com/filename -o localfilename
# 上传文件
curl -T localfilename -u yourusername:yourpassword ftp://ftp.example.com/
# 下载文件 /home/ftpuser/ftpfile/md.csv 下载到 /home/md1.csv md1.csv必须文件,不能是目录
curl -u ftpuser:Userftp@123 ftp://192.168.62.131:2121/md.csv -o /home/md12.csv
# 上传文件
curl -T /home/md12.csv -u ftpuser:Userftp@123 ftp://192.168.62.131:2121/
# 上传文件 改变文件名
curl -T /home/aa.txt -u ftpuser:Userftp@123 ftp://192.168.62.131:2121/aaaa-t.txt
6.代码编写
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.9.0</version>
</dependency>
jk.ftp.ip=192.168.62.131
jk.ftp.port=2121
#jk.ftp.port=21
jk.ftp.user=ftpuser
jk.ftp.pass=Userftp@123
## 上传到ftp服务器存放文件的路径
jk.ftp.path=/home/ftpuser/ftpfile/
import org.apache.commons.net.ftp.FTPClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
import static java.lang.System.*;
@Component
public class FTPUtil {
@Value("${jk.ftp.ip}")
private String ftpIp;
@Value("${jk.ftp.port}")
private Integer ftpPort;
@Value("${jk.ftp.user}")
private String ftpUser;
@Value("${jk.ftp.pass}")
private String ftpPass;
@Value("${jk.ftp.path}")
private String ftpUploadPath;
private FTPClient ftpClient;
private boolean connectServer(String ip,int port,String user,String pwd){
ftpClient=new FTPClient();
boolean succ =false;
try {
//连接 登录
ftpClient.connect(ip, port);
out.println("连接:"+ ftpClient.isConnected());
succ = ftpClient.login(user,pwd);
out.println("登录:"+ succ);
int replyCode = ftpClient.getReplyCode();
String replyString = ftpClient.getReplyString();
System.out.println("Login failed. Reply code: " + replyCode + ", Reply string: " + replyString);
} catch (IOException e) {
e.printStackTrace();
}
return succ;
}
/**
* 上传文件到ftp服务器
* @param fileName 文件名
* @param file File文件
* @return ftp服务器的文件地址+文件名
*/
private boolean uploadToFtp( String fileName, File file) throws IOException {
boolean upload = false;
FileInputStream fileInputStream = null;
//connect to ftpServer
if (connectServer(ftpIp, ftpPort, ftpUser, ftpPass)) {
try {
// /etc/vsftpd/vsftpd.conf 中配置了 local_root=/home/ftpuser/ftpfile/
// 这里目录如果不一致,文件将保存不了
//ftpClient.changeWorkingDirectory(ftpUploadPath);
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("UTF-8");
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
//上传文件 参数:上传后的文件名,输入流
upload = ftpClient.storeFile(fileName, new FileInputStream(file));
out.println("结果:"+ upload);
} catch (IOException e) {
e.printStackTrace();
upload = false;
} finally {
if(fileInputStream != null){fileInputStream.close();}
ftpClient.disconnect();
}
}
return upload;
}
/**
* 上传文件到ftp服务器
* @param filePath 文件路径
* @param filename 文件名
* @return ftp服务器的文件地址+文件名
*/
public String uploadFileToFtp(String filePath, String filename) {
File file = new File(filePath + filename);
try {
boolean result = uploadToFtp( filename, file);
if (result) {
out.println(filename + "上传至ftp服务器-成功!");
} else {
err.println(filename + "上传至ftp服务器-失败!");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return getFtpUrl(filename);
}
private String getFtpUrl( String newFileName) {
return newFileName;
// return ftpUploadPath + newFileName;
}
//-------------------------------------
/**
* controller 接口测试使用
* 上传文件到ftp服务器
* @param fileList
* @return
* @throws Exception
*/
public String uploadToFtp(MultipartFile[] fileList) throws Exception {
//1、获取原文件后缀名
MultipartFile multipartFile = fileList[0];
String originalFileName = multipartFile.getOriginalFilename();
String suffix = originalFileName.substring(originalFileName.lastIndexOf('.'));
//2、使用UUID生成新文件名
String newFileName = UUID.randomUUID() + suffix;
//3、将MultipartFile转化为File
File file = multipartFileToFile(multipartFile);
//4、上传至ftp服务器
if (uploadToFtp( newFileName, file)) {
out.println("上传至ftp服务器!");
} else {
out.println("上传至ftp服务器失败!");
}
return getFtpUrl( newFileName);
}
/**
* MultipartFile 转 File
* @param file MultipartFile
* @return File
* @throws Exception
*/
public static File multipartFileToFile(MultipartFile file) throws Exception {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
return toFile;
}
//获取流文件
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
补充:Linux 离线安装 ftp服务
下载地址:
https://developer.aliyun.com/packageSearch?word=vsftpd
或
https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/
麒麟仓库地址
https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/aarch64/Packages/
安装命令
rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm
补充:ubuntu 离线安装 ftp服务
地址:
https://pkgs.org/download/vsftpd
安装:
sudo dpkg -i vsftpd*.deb
sudo vim /etc/vsftpd.conf
开启写
write_enable=YES
创建用户
sudo adduser 用户名
sudo adduser ftpuser
随后会提示输入密码 :Userftp@123