Java上传副本文件到Centos服务器

参考自:

官网

JAVA FTPClient FTP简单操作

Centos 7使用vsftpd搭建FTP服务器

JAVA 程序实现文件到linux服务的上传与下载

Centos7.5搭建FTP服务-vsftpd(详细)

CentOS 7 安装 FTP 服务

Java利用ftp协议上传文件到linux服务器

CentOS 安装 FTP

安装vsftpd

安装前先查看 ftp 是否已经安装,使用 yum 安装

shell> vsftpd -v
shell> yum -y install vsftpd

修改vsftp配置文件,禁止匿名登录

根据自己需求,修改 ftp 配置文件 /etc/vsftpd/vsftpd.conf

166

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    未执行请求的操作:文件名不合法

结果

167

发布了18 篇原创文章 · 获赞 0 · 访问量 414

猜你喜欢

转载自blog.csdn.net/mikelv01/article/details/105473790