ftp安装
服务搭建:服务器为腾讯云服务器, 操作系统centos 7
安装命令: //有的服务器可能没有安装yum,需要先下载安装yum
yum -y install vsftpd
中途会有询问,输入yes 回车,直到出现complete安装完成
默认安装目录是/etc/vsftpd
然后修改配置文件
目录是/etc/vsftpd/vsftpd.conf
vi /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
值改为NO,意思是禁止匿名登录,不改也能用,不安全(之前服务器被黑过,慌)
1.3、设置vsftpd开机启动//自己玩可略过
systemctl enable vsftpd.service
1.4、启动并查看vsftpd服务状态,systemctl启动服务成功不会有任何提示,绿色的active表示服务正在运行
启动服务
systemctl start vsftpd.service
查看服务状态
systemctl status vsftpd.service
然后新建用户并指定用户根目录并禁止此用户登录操作系统(-s /bin/false)
useradd username -d /etc/vsftpd/ftpdata -s /bin/false
设置密码,passwd username
文件夹读写权限配置 chmod -777 /etc/vsftpd/ftpdata
文件夹可以指定,最好事先创建好文件夹 mkdir xxx
这里有个坑,就是我如果在ftpdata目录下新建文件夹,用户并没有新建的文件夹的读写权限,还需要继续授权,授权目录下所有文件夹权限
chmod -777 /etc/mulu/* 没试过 执行命令后新建目录是否管用
然后直接浏览器或者计算机里面输入 ftp://ip即可访问,输入用户名密码,展示的目录为创建用户时配置的根目录,能看到的文件都能操作(下载啥的)。
java连接ftp并实现文件上传
maven依赖
<!-- FTP工具类 -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
Java代码
public static void main(String[] args) throws Exception{
File file = new File("D:\\license_freeware.txt");
FTPClient ftpClient = new FTPClient();
String upFile = "66666.txt";
ftpClient.setControlEncoding("GBK");
String hostname = "118.24.xxx.xxx";
int port = 21;
String username = "user";
String password = "pswd";
try {
//链接ftp服务器
ftpClient.connect(hostname, port);
//登录ftp
ftpClient.login(username, password);
int reply = ftpClient.getReplyCode();
System.out.println(reply);
//如果reply返回230就算成功了
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return ;
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
String remoteFileName = "upload/"+upFile;
InputStream input = new FileInputStream(file);
boolean upload =ftpClient.storeFile(remoteFileName, input);//文件你若是不指定就会上传到根目录下,此时文件目录是 根目录/upload/66666.txt
boolean rename = ftpClient.rename("upload/66666.txt","dir/77777.txt");//看起来只是改名,实际上可以实现文件位置移动,类似于剪切粘贴比如这里文件位置从upload/66666.txt移动到了dir/77777.txt,原有66666.txt文件会消失
System.out.println("upload~~~~~~~~~~~~~~~~"+upload);
System.out.println("rename~~~~~~~~~~~~~~~~"+rename);
input.close();
ftpClient.logout();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally
{
if (ftpClient.isConnected())
{
try
{
ftpClient.disconnect();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
}
关键逻辑代码里面都有标注,都是最基本的api调用,只是单纯的使用
另外记录一下ftp,sftp,ftps
ftp:文件传输协议,很单纯
sftp:使用ssh加密的文件传输协议,会牺牲一部分资源用于数据保密,
ftps:使用ssl加密的文件传输协议,但是ssl加密一般用于http等协议的加密,ssl加密方式类似于打包,ssh类似于铺设管道,所以ssh更适合大文件传输。