首先需要写封装一个Util,再写一个demo测试上传效果。
先说一下,写好Java工具之后,有的服务器初始是没有开通ftp服务的,待我介绍完Java代码后再讲怎么开通服务器FTP服务。
第一步:
FtpUtils.java
直接复制粘贴到idea中就行,Util没有需要修改的地方,看提示需要什么jar包导入一下就行,应该没有奇奇怪怪的jar包,都能下载到
public class FtpUtils {
//打印日志使用
private static final Logger log = LoggerFactory.getLogger(FtpUtils.class);
/**
* 获取FTPClient对象
*
* @param ftpHost
* FTP主机服务器
* @param ftpPassword
* FTP 登录密码
* @param ftpUserName
* FTP登录用户名
* @param ftpPort
* FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
FTPClient ftpClient = null;
try {
//创建一个ftp客户端
ftpClient = new FTPClient();
// 连接FTP服务器
ftpClient.connect(ftpHost, ftpPort);
// 登陆FTP服务器
ftpClient.login(ftpUserName, ftpPassword);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
log.info("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
log.info("FTP连接成功。");
}
} catch (SocketException e) {
e.printStackTrace();
log.info("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
log.info("FTP的端口错误,请正确配置。");
}
return ftpClient;
}
/**
* 下载文件
*
* @param ftpHost ftp服务器地址
* @param ftpUserName anonymous匿名用户登录,不需要密码。administrator指定用户登录
* @param ftpPassword 指定用户密码
* @param ftpPort ftp服务员器端口号
* @param ftpPath ftp文件存放物理路径
* @param localPath 本地存储文件的路径
* @param fileName 文件名称
*/
public static void downloadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName) {
FTPClient ftpClient = null;
try {
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(ftpPath);
File localFile = new File(localPath + File.separatorChar + fileName);
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(fileName, os);
os.close();
ftpClient.logout();
} catch (FileNotFoundException e) {
log.error("没有找到" + ftpPath + "文件");
e.printStackTrace();
} catch (SocketException e) {
log.error("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
log.error("文件读取错误。");
e.printStackTrace();
}
}
/**
* 上传文件
*
* @param ftpHost ftp服务器地址
* @param ftpUserName anonymous匿名用户登录,不需要密码。administrator指定用户登录
* @param ftpPassword 指定用户密码
* @param ftpPort ftp服务员器端口号
* @param ftpPath ftp文件存放物理路径
* @param fileName 文件路径
* @param input 文件输入流,即从本地服务器读取文件的IO输入流
*/
public static void uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String fileName,InputStream input){
FTPClient ftp=null;
try {
ftp=getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftp.makeDirectory(ftpPath);
ftp.enterLocalPassiveMode();
ftp.changeWorkingDirectory(ftpPath);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
fileName=new String(fileName.getBytes("UTF-8"));
ftp.storeFile(fileName, input);
input.close();
ftp.logout();
System.out.println("upload succes!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
第二步,开始写测试连接demo
public class GetConnectByFtp {
@Test
public void getFTPClient() throws FileNotFoundException {
//上传文件
FileInputStream input = new FileInputStream(new File("可以是windows桌面的路径,例如:E:\\DesktopFiles\\20230302bak.txt"));
FtpUtils.uploadFile("服务器IP","ssh用户名","ssh密码",默认就是21,一般不用改,"需要上传到服务器的路径","上传到服务器上之后以什么样的名字展示",input);
}
@Test
public void getFile() throws FileNotFoundException {
//下载文件
FtpUtils.downloadFile("ip","用户名","密码",21,"服务器路径","E:\\DesktopFiles\\aaa\\","222.txt");
}
}
到这里可以测试一下试试了,按我的路径来的话,桌面上要有一个名为20230302bak的txt文件。我这里因为服务器开通过ftp服务了,所以上传成功了
下面讲一下怎么在服务器开通ftp服务,这个也简单,就三步
首先,查看ftp运行状态
service vsftpd status
如果没有运行或没安装,那我们就开始安装开通ftp
1.安装ftp服务
yum -y install vsftpd
2.配置可访问名单
如果需要开启root用户的ftp权限要修改以下两个文件
vim /etc/vsftpd/ftpusers中注释掉root
vim /etc/vsftpd/user_list中注释掉root
3.配置文件种配置开通pavs访问
vim /etc/vsftpd/vsftpd.conf
在最后添加
pasv_enable=YES
4.设置所有客户端可访问
setsebool allow_ftpd_full_access 1
最后,重启ftp服务
service vsftpd restart
到此,服务器ftp安装服务已经结束了,再次测试应该就可以上传成功了。