为什么需要ftp
FTP(File Transfer Protocol)是一种用于在计算机网络上进行文件传输的协议。它允许用户在客户端和服务器之间传输文件,支持上传、下载、删除、重命名等文件操作。
在这次的简易版抖音项目中,涉及到了视频的上传和下载。相比于本地存储,ftp服务器的优点包括:
- 传输效率: 视频文件通常较大,使用FTP服务器可以提供更高的传输速度和稳定性,从而加快上传和下载视频的速度。
- 分布式存储: FTP服务器可以作为一个中心化的存储和传输平台,无论在哪里部署我们的项目,都不影响文件上传的地址。如果项目未来发展成分布式微服务架构,FTP服务器可以提供一个稳定的基础。
- 权限控制: 可以通过FTP服务器实现基于用户的访问权限控制,保护视频文件的安全性,只允许授权用户访问特定文件。
实践
我们使用阿里云服务器作为项目服务器,因为其提供了学生试用活动,可以免费使用服务器一个月的时间。这对于学生来说,提供了一个很好的练手和实践的机会。
1. Docker部署ftp服务
前提:已有docker环境
1.1 安装ftp镜像
docker pull fauria/vsftpd
1.2 启动镜像
docker run -d -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -v /home/ftp:/home/vsftpd -e FTP_USER=ftpuser -e FTP_PASS=123456 -e PASV_ADDRESS=48.112.113.17 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd
其中ftpuser 是用户名, 123456 是密码, 192.168.152.100 是宿主机ip,记得根据实际情况进行修改。
2. 修改配置文件,实现匿名登陆功能
这一步是为了方便后续通过nginx实现http访问ftp文件服务器,否则无法实现视频播放功能。
2.1 将容器内/etc/vsftpd/vsftpd.conf文件复制到本地
docker cp vsftpd:/etc/vsftpd/vsftpd.conf 本地路径
2.2 修改配置文件
执行vim vsftpd.conf, - 将文件内anonymous_enable设置为YES, 并添加以下配置:
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
重要:匿名用户只能访问ftp服务器上的/var/ftp/pub目录。因此我们需要修改匿名用户登录根路径,让它与ftpuser访问的是同一个地址。增加这一行anon_root=/opt其中的/opt修改为实际的文件目录。
2.3 将修改后的文件复制回容器
docker cp ./vsftpd.conf vsftpd:/etc/vsftpd/
2.4 重启容器
exit
docker restart vsftpd
之后,我们就可以在项目中连接该ftp服务器存储上传的视频。
2. 项目中连接服务器
导入"github.com/dutchcoders/goftp"包。定义以下常量:
- const ConConfig = "你的服务器地址:21"
- const FtpUser = "ftpuser"
- const FtpPsw = "123456"
- const HeartbeatTime = 2 * 60
- var MyFTP *goftp.FTP
MyFTP, err = goftp.Connect(config.ConConfig)连接ftp服务器;err = MyFTP.Login(config.FtpUser, config.FtpPsw)登录服务器;- 由于ftp服务器一段时间无响应会断开连接,记得在代码中加一行
go keepAlive(),另外写一个函数:
//每两分钟给ftp发送空消息保存连接
func keepAlive() {
for {
time.Sleep(time.Duration(config.HeartbeatTime) * time.Second)
err := MyFTP.Noop()
if err != nil {
log.Printf("FTP NOOP Fail")
}
log.Printf("FTP NOOP Successed")
}
}
在项目中,使用file, err := c.FormFile("data")接收表单传来的文件file。为了将file文件上传保存到ftp服务器,执行这行代码:err = ftp.MyFTP.Stor(videoName, file)即可实现。