Работа с протоколом FTP
Одним из преимуществ использования Golang является его пакет http , который обеспечивает простой способ создания надежных API REST.
К сожалению, он не предоставляет из коробки возможность построить FTP-сервер или подключиться к FTP-серверу.
В этой статье мы рассмотрим это, продемонстрировав использование двух сторонних пакетов, которые позволяют это.
Подключение к FTP-серверу
Самый надежный и широко используемый пакет, обеспечивающий сборку FTP-клиента Julien .
Монтаж
go get -u github.com/jlaffaye/ftp
Применение
Вы можете подключить целевой FTP-сервер, как показано в следующем фрагменте кода:
client, err := fto.Dial("localhost:21")
if err != nil {
return err
}
if err := client.Login("root", "password"); err != nil {
return err
}
Следующий фрагмент кода отображает, загружает и удаляет все файлы, соответствующие дикой карте.
entries, _ := client.List(wildcard)
for _, entry := range entries {
name := entry.Name
reader, err := client.Retr(name)
if err != nil {
panic(err)
}
client.Delete(name)
}
Для более продвинутых вариантов использования вы можете прочитать документацию .
Создание FTP-сервера
Очень просто создать FTP-сервер, используя пакет goftp / server , который обеспечивает инфраструктуру для построения FTP-сервера с любым типом хранилища данных (файловая система, AWS3 и т. Д.).
Монтаж
go get github.com/goftp/server
Применение
Чтобы запустить сервер, вам необходимо разработать или использовать драйвер, который реализует интерфейс, который действует как мост между протоколом FTP и вашим желаемым хранилищем:
type Driver interface {
Init(*Conn)
Stat(string) (FileInfo, error)
ChangeDir(string) error
ListDir(string, func(FileInfo) error) error
DeleteDir(string) error
DeleteFile(string) error
Rename(string, string) error
MakeDir(string) error
GetFile(string, int64) (int64, io.ReadCloser, error)
PutFile(string, io.Reader, bool) (int64, error)
}
В настоящее время доступны следующие драйверы:
Файловая система Postfix FileSystem
Посмотрим, как мы можем использовать драйвер файловой системы для создания собственного FTP-сервера. Мы должны установить пакет:
go get github.com/goftp/file-driver
Затем мы должны инициализировать и запустить ftp-сервер с помощью следующего фрагмента кода:
factory := &filedriver.FileDriverFactory{
RootPath: "path_to_directory_that_will_store_all_files",
Perm: server.NewSimplePerm("root", "root")
}
opts := &server.ServerOpts{
Factory: factory,
Port: 2001,
Hostname: "127.0.0.1",
}
server := server.NewServer(opts)
server.ListenAndServe()
В RootPathопределяет , где файлы будут сохранены, в то время как Permполе определяет , как пользователь собирается пройти проверку подлинности. В настоящее время пакет поддерживает однопользовательскую аутентификацию с использованием SimplePermили вы можете использовать более совершенную аутентификацию LevelDB .