golang上传文件到ftp服务器

it2023-03-24  78

 

搭建ftp服务器

install

centos7

yum -y install vsftpd

ubuntu

apt-get install -y vsftpd

 

查看是否安装成功

service vsftpd status

禁用匿名登录

centos环境,配置文件位置在/etc/vsftpd/vsftpd.conf

vim /etc/vsftpd/vsftpd.conf 修改anonymous_enable=YES为 anonymous_enable=NO 重启ftp systemctl restart vsftpd

ubuntu环境,配置文件位置在/etc/vsftpd.conf 。默认禁用了匿名登录

通过查看ftpusers 和 user_list是登录的黑名单和白名单

但是直接使用root竟然无法登陆成功,原因在于root恰好处于ftpusers列表,是黑名单无法登录,因此必须注释掉ftpusers和user_list里面的root才可以使用root用户登录。

添加用户密码

# 添加katy用户 useradd -m katy#会在/home下创建katy目录 # 给katy用户添加密码 # 密码规则: # The password is shorter than 8 characters;不能小于8个字符 # The password contains the user name in some form。也不能包含用户名 passwd katy # 这里会有两次输入密码的操作,一次是新密码,还有一次是确认密码。 # 指向已存在的目录,用户名为buildpack,已存在的目录再添加user会给提示 [root@warehouse demo]# useradd -d /var/lib/it/data/buildpack -s /bin/sh buildpack useradd: warning: the home directory already exists. Not copying any file from skel directory into it. # 给buildpack设置密码 passwd buildpack [如果目录不在/home下,那么需要给目录777权限:chmod 777 /var/lib/it/data/buildpack],否则报错:550-Create directory operation failed centos环境给非/home目录下的文件夹设置了777权限后可以正常上传文件,但是ubuntu环境就不行,总是报错:550 Permission denied ubuntu环境是因为配置文件里面默认不允许文件上传,于是修改/etc/vsftpd.conf,允许文件上传。

ubuntu环境默认不允许文件上传,取消掉write_enable=YES,前面的#即可,重启ftp。 

 

日志文件

cat /var/log/xferlog

文件上传

ftp的文件默认是在/home/katy下。即在创建的用户名下。如/home/katy

 

 

代码实现文件上传和下载

得到访问ftp的client

type ftpClient struct { *goftp.Client } func newClient(serverAddr, user, password string) (*ftpClient, error) { ftp, err := goftp.DialConfig(goftp.Config{ User: user, Password: password, ConnectionsPerHost: 10, Timeout: time.Second * 30, }, serverAddr) if err != nil { return nil, errors.New("Fail to conn to ftp server " + serverAddr + " due to " + err.Error()) } return &ftpClient{Client: ftp}, nil }

上传

func (client ftpClient) FtpUpload(ns, localFile string) (string, error) { // 1. 先判断local file是否存在 file, err := os.Open(localFile) // Could not create file //file, err := os.OpenFile(localFile, syscall.O_CREAT|syscall.O_WRONLY|syscall.O_TRUNC, 0744) if err != nil { return "", err } defer file.Close() // 2.得到pwd pwd, pwdErr := client.Client.Getwd() if pwdErr != nil { return "", err } // 2. 创建savePath savePath := path.Join(pwd, ns) _, err = client.Client.Mkdir(savePath) if err != nil { // 由于搭建ftp的时候已经给了`pwd` 777的权限,这里忽略文件夹创建的错误 if !strings.Contains(err.Error(), "550-Create directory operation failed") { return "", err } } // 上传完毕后关闭当前的ftp连接 defer client.Client.Close() dstName := filepath.Base(file.Name()) dstPath := path.Join(savePath, dstName) // 文件上传 return dstPath, client.Client.Store(dstPath, file) }

下载

最新回复(0)