go语言实现简易ftp客户端
Go语言实现的ftp库挺多的,我在这里尝试了一个简单的版本,地址https://github.com/dutchcoders/goftp。
先安装依赖:
go get -u -v github.com/dutchcoders/goftp
- 1
然后配置好ftp服务器,编译执行以下代码,代码包括列出列表和上传功能:
package main
import (
"github.com/dutchcoders/goftp"
"fmt"
"os"
)
func main() {
var err error
var ftp *goftp.FTP
// For debug messages: goftp.ConnectDbg("ftp.server.com:21")
if ftp, err = goftp.Connect("server_ip:21"); err != nil {
panic(err)
}
defer ftp.Close()
fmt.Println("Successfully connected !!")
// Username / password authentication
if err = ftp.Login("user", "pass"); err != nil {
panic(err)
}
if err = ftp.Cwd("/home/ftp"); err != nil {
panic(err)
}
var curpath string
if curpath, err = ftp.Pwd(); err != nil {
panic(err)
}
fmt.Printf("Current path: %s", curpath)
// Get directory listing
var files []string
if files, err = ftp.List(""); err != nil {
panic(err)
}
fmt.Println("Directory listing:/n", files)
// Upload a file
var file *os.File
if file, err = os.Open("E://6楼花名册.xlsx"); err != nil {
panic(err)
}
if err := ftp.Stor("/home/ftp/6楼花名册.xlsx", file); err != nil {
panic(err)
}
}
上传文件代码示例如下:
// Package goftp upload helper
package goftp
import (
"os"
"path/filepath"
)
func (ftp *FTP) copyDir(localPath string) error {
fullPath, err := filepath.Abs(localPath)
if err != nil {
return err
}
pwd, err := ftp.Pwd()
if err != nil {
return err
}
walkFunc := func(path string, fi os.FileInfo, err error) error {
// Stop upon error
if err != nil {
return err
}
relPath, err := filepath.Rel(fullPath, path)
if err != nil {
return err
}
switch {
case fi.IsDir():
// Walk calls walkFn on root as well
if path == fullPath {
return nil
}
if err = ftp.Mkd(relPath); err != nil {
if _, err = ftp.List(relPath + "/"); err != nil {
return err
}
}
case fi.Mode()&os.ModeSymlink == os.ModeSymlink:
fInfo, err := os.Stat(path)
if err != nil {
return err
}
if fInfo.IsDir() {
err = ftp.Mkd(relPath)
return err
} else if fInfo.Mode()&os.ModeType != 0 {
// ignore other special files
return nil
}
fallthrough
case fi.Mode()&os.ModeType == 0:
if err = ftp.copyFile(path, pwd+"/"+relPath); err != nil {
return err
}
default:
// Ignore other special files
}
return nil
}
return filepath.Walk(fullPath, walkFunc)
}
func (ftp *FTP) copyFile(localPath, serverPath string) (err error) {
var file *os.File
if file, err = os.Open(localPath); err != nil {
return err
}
defer file.Close()
if err := ftp.Stor(serverPath, file); err != nil {
return err
}
return nil
}
// Upload a file, or recursively upload a directory.
// Only normal files and directories are uploaded.
// Symlinks are not kept but treated as normal files/directories if targets are so.
func (ftp *FTP) Upload(localPath string) (err error) {
fInfo, err := os.Stat(localPath)
if err != nil {
return err
}
switch {
case fInfo.IsDir():
return ftp.copyDir(localPath)
case fInfo.Mode()&os.ModeType == 0:
return ftp.copyFile(localPath, filepath.Base(localPath))
default:
// Ignore other special files
}
return nil
}
go语言实现简易ftp客户端的更多相关文章
- C语言:自己编写的简易ftp客户端,包含(列表,进入目录,上传文件,下载文件,删除文件)功能
//简易ftp客户端#include <stdio.h> #include <string.h> #include <sys/types.h> #include & ...
- WebSocket实现简易的FTP客户端
WebScoket的简单应用,实现一个简易的FTP,即文件上传下载,可以查看上传人,下载次数,打开多个Web可以多人上传. 说在前面的话 文件传输协议(File Transfer Protocol,F ...
- ClassicFTP for Mac(FTP 客户端)破解版安装
1.软件简介 ClassicFTP 是 macOS 系统上一款易于使用的 FTP 客户端,让您能够从远程服务器(网站)或网络查看,编辑,上传,下载和删除文件的免费的软件.Mac 下的一款使用 F ...
- 使用 Socket 通信实现 FTP 客户端程序(来自IBM)
FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...
- 【RL-TCPnet网络教程】第37章 RL-TCPnet之FTP客户端
第37章 RL-TCPnet之FTP客户端 本章节为大家讲解RL-TCPnet的FTP客户端应用,学习本章节前,务必要优先学习第35章的FTP基础知识.有了这些基础知识之后,再搞本章节会有事 ...
- 【转载】HTTP/FTP客户端开发库:libwww、libcurl、libfetch
网页抓取和ftp访问是目前很常见的一个应用需要,无论是搜索引擎的爬虫,分析程序,资源获取程序,WebService等等都是需 要的,自己开发抓取库当然是最好了,不过开发需要时间和周期,使用现有的Ope ...
- 使用Socket通信实现FTP客户端程序
FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...
- Linux FTP客户端
1.File Zilla File Zilla是一个开源的,跨平台的Linux FTP客户端.File Zilla有一个标签式的用户界面,允许用户查看正在传输的文件的所有细节.File Zilla是通 ...
- Socket网络编程--FTP客户端
Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...
随机推荐
- JS基础_js编写位置
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 19、Firewalld防火墙
安全的考虑方向: 安全框架 OSI七层模型 硬件 机架上锁(机柜) 温度 硬件检查 网络 iptables/firewalld 仅允许公司的IP地址能连接服务器的22端口 公有云使用 安全组 系统 没 ...
- 15、Nginx动静分离实战
1.Nginx动静分离基本概述 动静分离, 通过中间件将动静分离和静态请求进行分离. 那为什么要通过中间件将动态请求和静态请求进行分离? 减少不必要的请求消耗, 同时能减少请求的延时. 通过中间件将动 ...
- BLE 5协议栈-物理层
文章转载自:http://www.sunyouqun.com/2017/04/page/4/ 1. 简介 物理层(Physical Layer)是BLE协议栈最底层,它规定了BLE通信的基础射频参数, ...
- npm install 报错,提示`gyp ERR! stack Error: EACCES: permission denied` 解决方法
m install 报错,提示gyp ERR! stack Error: EACCES: permission denied 猜测可能是因为没有权限读写,ls -la看下文件权限设置情况 [root@ ...
- 北美CS求学找工指南
这篇文章主要谈谈来美求学工作这一路的点点滴滴,因为之前留言中不少同学对这方面内容比较感兴趣,有些已经在准备,有些还在犹豫,希望本文能对大家有些许帮助.因为来美的途径也有不少,有上学.有投资.有通过国内 ...
- spfa算法及判负环详解
spfa (Shortest Path Faster Algorithm) 是一种单源最短路径的算法,基于Bellman-Ford算法上由队列优化实现. 什么是Bellman_Ford,百度内 ...
- ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机【OK】
ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机[OK] 使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能 ...
- 【Linux学习二】Linux文件系统
Linux文件系统结构 ●Linux文件系统是一种倒转的单根结构 ●文件系统的根是"/" ●文件系统严格区分大小写 ●路径使用"/"分割(window下为&qu ...
- C#定时任务之FluentScheduler
一.业务需求 平台首页,有几个指标统计,产品不要求实时性,觉得一天更新一次可以接受. 最后决定用FluentScheduler定时执行统计,redis缓存结果. 每天晚上1点进行定时任务统计,将统计结 ...