ftp服务器
ftp服务器的作用
ftp服务器是用来上传文件或者删除文件用的,一般搭建图片服务器都需要使用它
windows搭建ftp服务器(配套tomcat完成图片服务器的搭建)
搭建
-
打开控制面板,选择程序,启用或关闭windows功能
-
将ftp服务器和web管理工具全部勾选
-
在tomcat服务下建一个文件夹用于存放ftp上传的图片
-
到计算机管理界面点击Internet信息服务
-
右键添加ftp站点
-
设置站点信息,选择ftp文件夹,名称自定义
-
绑定IP和设置SSL证书,没有证书就按照下图来
-
设置身份校验和授权,匿名就是访问ftp不需要登录,基本就需要登录,账户密码为当前创建ftp服务的windows用户密码
访问
- 打开本地系统资源,输入ftp://ip
- 可以复制本地文件到资源中上传,打开tomcat服务并访问图片即可
linux搭建ftp服务器(配套tomcat完成图片服务器的搭建)
#1. 查看当前服务器是否安装了vsftpd
[root@Centos100 ~]# which vsftpd
#2. 安装vsftpd,安装完成后在/etc下面会有一个vsftpd目录
[root@Centos100 ~]# yum -y install vsftpd
#3. 到 /etc/vsftpd/目录下修改vsftpd.conf
[root@Centos100 ~]# vi /etc/vsftpd/vsftpd.conf
local_enable=YES
write_enable=YES
local_root=/software/tomcat/apache-tomcat-9.0.41/webapps/pic #设置ftp访问目录,注意目录必须设置权限为755以上
allow_writeable_chroot=YES
chroot_local_user=YES
#4. 去掉文件ftpusers和user_list里面的root,使用户可以通过root连接ftp上传文件
#5. 关闭防火墙,启动ftp服务
[root@Centos100 ~]# service firewalld stop
[root@Centos100 ~]# service vsftpd start
#6. 在本地windows文件系统上测试一下查看,上传,下载,删除,重命名,如果不行,再试一下修改下面的配置
#方法一(需要重启服务器)
[root@Centos100 ~]# vi /etc/selinux/config
SELINUX=disabled #将SELINUX设置为disabled,然后重启服务器,输入以下名令查询状态
[root@Centos100 ~]# getenforce
Disabled #确认是该状态后再关闭防火墙启动ftp服务
#方法二(当前会话有效,需要配合方法一,以防服务器重启后无效,可以避免重启)
[root@Centos101 ~]# setenforce 0
注: 匿名访问模式,我试了好几次都失败了,如果有人配置成功,请在下方留言与我分享,谢谢!
使用javaAPI操作ftp完成上传下载删除
依赖
<!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
ftp工具类
import java.net.SocketException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class FtpUtil {
/**
* 获取ftp客户端连接
* @param ftpHost
* @param ftpUserName
* @param ftpPassword
* @param ftpPort
* @return
*/
private static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
FTPClient ftpClient = null;
try {
ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort);
if(Utils.isNotEmpty(ftpUserName)) {
ftpClient.login(ftpUserName, ftpPassword);
}else {
ftpClient.login("anonymous", null);
}
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
System.out.println("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
System.out.println("FTP连接成功。");
}
//这个在对接linux服务器的时候必须要加,不加上传不上去
ftpClient.enterLocalPassiveMode();
} catch (SocketException e) {
e.printStackTrace();
System.out.println("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
System.out.println("FTP的端口错误,请正确配置。");
}
return ftpClient;
}
/**
* 删除ftp上的文件
* @param ftpHost ftp主机
* @param ftpUserName 用户,匿名登录使用anonymous,即不需要密码
* @param ftpPassword 密码
* @param ftpPort 端口
* @param ftpPath ftp路径
* @param fileName 删除的文件名称
*/
public static void deleteFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, 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);
ftpClient.deleteFile(fileName);
ftpClient.logout();
} catch (FileNotFoundException e) {
System.out.println("没有找到" + ftpPath + "文件");
e.printStackTrace();
} catch (SocketException e) {
System.out.println("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件读取错误。");
e.printStackTrace();
}
}
/**
* 下载文件(web应用一般用不到,客户端应用会用到)
* @param ftpHost ftp主机
* @param ftpUserName 用户,匿名登录使用anonymous,即不需要密码
* @param ftpPassword 密码
* @param ftpPort 端口
* @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) {
System.out.println("没有找到" + ftpPath + "文件");
e.printStackTrace();
} catch (SocketException e) {
System.out.println("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件读取错误。");
e.printStackTrace();
}
}
/**
* 上传文件
* @param ftpHost ftp主机
* @param ftpUserName 用户,匿名登录使用anonymous,即不需要密码
* @param ftpPassword 密码
* @param ftpPort 端口
* @param ftpPath ftp路径
* @param fileName 上传的文件名称
* @param input 上传的文件流
*/
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);
boolean makeDirectory = ftp.makeDirectory(ftpPath);
boolean changeWorkingDirectory = ftp.changeWorkingDirectory(ftpPath);
boolean setFileType = ftp.setFileType(FTP.BINARY_FILE_TYPE);
boolean storeFile = ftp.storeFile(fileName, input);
System.out.println(Boolean.toString(makeDirectory) + Boolean.toString(changeWorkingDirectory) + Boolean.toString(setFileType) + Boolean.toString(storeFile));
input.close();
ftp.logout();
System.out.println("upload succes!");
} catch (Exception e) {
e.printStackTrace();
}
}
}