参考自:
JAVA 程序实现文件到linux服务的上传与下载
Java利用ftp协议上传文件到linux服务器
CentOS 安装 FTP
安装vsftpd
安装前先查看 ftp 是否已经安装,使用 yum 安装
shell> vsftpd -v
shell> yum -y install vsftpd
修改vsftp配置文件,禁止匿名登录
根据自己需求,修改 ftp 配置文件 /etc/vsftpd/vsftpd.conf
anonymous_enable=NO # 是否允许匿名访问
local_enable=YES # 是否允许使用本地帐户进行 FTP 用户登录验证
local_umask=022 # 设置本地用户默认文件掩码022
chroot_local_user=YES # 是否限定用户在其主目录下(NO 表示允许切换到上级目录)
#chroot_list_enable=YES # 是否启用限制用户的名单(注释掉为禁用)
chroot_list_file=/etc/vsftpd/chroot_list # 用户列表文件(一行一个用户)
allow_writeable_chroot=YES # 如果启用了限定用户在其主目录下需要添加这个配置,解决报错 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
xferlog_enable=YES # 启用上传和下载的日志功能,默认开启。
use_localtime=YES # 是否使用本地时(自行添加)
userlist_enable=YES
如果需要上传到指定目录的话,可以在配置文件中加入以下
local_root=/home/xxx/
设置vsftpd服务,开机自启
systemctl enable vsftpd
启动vsftpd服务
systemctl start vsftpd.service
在防火墙中开启21端口号(这里使用的是CentOs7以后的版本)
firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload
添加用户
useradd ftpuser
passwd ftpuser
通过 ftp协议完成文件上传
import org.apache.commons.net.ftp.FTPClient;
import java.net.URL;
import java.net.URLConnection;
public FTPClient getFtpClient(String ftpHost,int ftpPort,
String ftpUserName,String ftpPassword) throws ApiRestException {
FTPClient ftp = null;
try {
ftp = new FTPClient();
//登录ftp
ftp.connect(ftpHost,ftpPort);
ftp.login(ftpUserName,ftpPassword);
//设置超时时间,5000毫秒
ftp.setConnectTimeout(5000);
//设置中文编码集,防止中文乱码
ftp.setControlEncoding("UTF-8");
if(!FTPReply.isPositiveCompletion(ftp.getReplyCode())){
log.info("Ftp服务器 拒绝连接");
ftp.disconnect();
}else{
log.info("ftp连接成功");
}
}catch (SocketException e) {
throw new ApiRestException(e.toString(),500);
} catch (IOException e) {
throw new ApiRestException(e.toString(),500);
}
return ftp;
}
public boolean closeFTP(FTPClient ftp) throws ApiRestException {
try {
ftp.logout();
return true;
} catch (IOException e) {
log.info("ftp 关闭失败");
throw new ApiRestException(e.toString(),500);
}finally {
if(ftp.isConnected()){
try {
ftp.disconnect();
} catch (IOException e) {
log.error("ftp关闭失败");
throw new ApiRestException(e.toString(),500);
}
}
}
}
public void saveXXXAsFile() throws ApiRestException {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
String baseDir = "/home/xxx" + sdf.format(date);
String filename = System.currentTimeMillis() + ".json";
try {
URL nlpUrl = new URL("xxx");
URLConnection urlConn = nlpUrl.openConnection();
BufferedInputStream bis = new BufferedInputStream(urlConn.getInputStream());
//连接
FTPClient ftpClient = getFtpClient("192.168.x.x", 21,
"ftpuser", "ftpuser");
//当目录不存在的情况,新建目录
if(!ftpClient.changeWorkingDirectory(baseDir)){
ftpClient.makeDirectory(baseDir);
ftpClient.changeWorkingDirectory(baseDir);
}
ftpClient.setBufferSize(1024 * 1024);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(filename, bis);
//关闭连接
bis.close();
closeFTP(ftpClient);
} catch (IOException e) {
log.error("uploadFileError:{}",e);
throw new ApiRestException(e.getMessage(),500);
}
}
FTP应答码&响应码
110: 重新启动标记应答。
120: 在n分钟内准备好
125: 连接打开准备传送
150: 打开数据连接
200: 命令成功
202: 命令失败
211: 系统状态
212: 目录状态
213: 文件状态
214: 帮助信息
215: 名字系统类型
220: 新用户服务准备好了
221: 服务关闭控制连接,可以退出登录
225: 数据连接打开,无传输正在进行
226: 关闭数据连接,请求的文件操作成功
227: 进入被动模式
230: 用户登录
250: 请求的文件操作完成
257: 创建"PATHNAME"
331: 用户名正确,需要口令
332: 登录时需要帐户信息
350: 下一步命令
421: 不能提供服务,关闭控制连接
425: 不能打开数据连接
426: 关闭连接,中止传输
450: 请求的文件操作未执行
451: 中止请求的操作:有本地错误
452: 未执行请求的操作:系统存储空间不足
500: 格式错误,命令不可识别
501: 参数语法错误
502: 命令未实现
503: 命令顺序错误
504: 此参数下的命令功能未实现
530: 未登录
532: 存储文件需要帐户信息
550: 未执行请求的操作
551: 请求操作中止:页类型未知
552: 请求的文件操作中止,存储分配溢出
553: 未执行请求的操作:文件名不合法
FTP术语
150 文件状态良好,打开数据连接
200 命令成功
202 命令未实现
211 系统状态或系统帮助响应
212 目录状态
213 文件状态
214 帮助信息,信息仅对人类用户有用
215 名字系统类型
220 对新用户服务准备好
221 服务关闭控制连接,可以退出登录
225 数据连接打开,无传输正在进行
226 关闭数据连接,请求的文件操作成功
227 进入被动模式
230 用户登录
250 请求的文件操作完成
257 创建"PATHNAME"
331 用户名正确,需要口令
332 登录时需要帐户信息
350 请求的文件操作需要进一步命令
421 连接用户过多
425 不能打开数据连接
426 关闭连接,中止传输
450 请求的文件操作未执行
451 中止请求的操作:有本地错误
452 未执行请求的操作:系统存储空间不足
500 格式错误,命令不可识别
501 参数语法错误
502 命令未实现
503 命令顺序错误
504 此参数下的命令功能未实现
530 账号或密码错误
532 存储文件需要帐户信息
550 未执行请求的操作
551 请求操作中止:页类型未知
552 请求的文件操作中止,存储分配溢出
553 未执行请求的操作:文件名不合法
结果