[golang]简单的文件上传下载

简介: [golang]简单的文件上传下载

前言

某次在客户内网传输数据的时候,防火墙拦截了SSH的数据包,导致没法使用scp命令传输文件,tcp协议和http协议也只放开了指定端口,因此想了个用http传输的“曲线救国”方案。

假设要从192.168.1.23传输到192.168.2.34,因防火墙限制,只能从1.23访问2.34,不能从2.34访问1.23,且1.23只能访问2.34的12345端口,也不能使用基于ssh的文件传输。

在2.34创建一个api,监听12345端口,处理http的post请求和get请求,实现文件上传和文件下载功能。

基于gin框架,编译成二进制文件,丢到服务器就能运行,无需处理依赖问题。

示例代码

package main
import (
  "fmt"
  "log"
  "net/http"
  "flag"
  "strconv"
  "github.com/gin-gonic/gin"
)
func main() {
  upload := flag.String("u","./","-u 指定文件上传目录")
  download := flag.String("d","./","-d 指定文件下载目录")
  port := flag.Int("p",12345,"-p 指定监听端口号")
  size := flag.Int64("s", 100, "-s 指定请求体文件大小, 单位: MB")
  flag.Parse()
  r := gin.Default()
  r.Static("/download", *download)
  // 为 multipart forms 设置文件大小限制, 默认是32MB
  // 此处为左移位运算符, << 20 表示1MiB,8 << 20就是8MiB
  r.MaxMultipartMemory = *size << 20 // 8 MiB
  r.POST("/upload", func(c *gin.Context) {
    // 单文件
    file, _ := c.FormFile("file")
    log.Println(file.Filename)
    // 上传文件至指定的完整文件路径
    dst := *upload + file.Filename
    c.SaveUploadedFile(file, dst)
    c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
  })
  listenAddr := "0.0.0.0:" + strconv.Itoa(*port)
  r.Run(listenAddr)
}

示例使用

# 在192.168.2.34先运行,设置请求体限制大小为1G
./appname -s 1000
# 上传当前目录下的test.tar.gz
curl -X POST 'http://192.168.2.34:12345/upload' -H "Content-Type: multipart/form-data" -F "file=@./test.tar.gz"
# 在其它能访问到192.168.2.34的服务器下载
curl -O http://192.168.2.34:12345/download/test.tar.gz
相关文章
|
6月前
|
存储 人工智能 Go
探索Gin框架:Golang使用Gin完成文件上传
探索Gin框架:Golang使用Gin完成文件上传
|
6月前
|
Go Windows
win10 golang下载安装,及环境变量配置
鄙人之前是使用mac做golang开发的,后来换了台图形工作站,用了windows的系统,因此只得从头下载golang安装,及进行环境变量的配置。比较方便的一点是,之前在mac osx上码的golang代码不用再敲上一遍了,因为golang可以跨平台运行,可以直接从mac上的golang代码复制到windows系统上即可。
89 1
|
Cloud Native 程序员 Go
《阿里开发者手册-Golang专题》电子版下载地址
本期以 Go 语言为主题,收纳阿里巴巴资深程序员语青、丛霄、蜂翅、赋行、路德、冀锋 6 位的优秀技术文章。精解 Go 语言开发应用、常见技术难点以及产品创新实践等,帮助更多开发者快速掌握 Go 语言核心架构及功能,高效解决问题,提升研发效率,在云原生的浪潮下扬帆起航!
288 0
《阿里开发者手册-Golang专题》电子版下载地址
|
Cloud Native 程序员 Go
《阿里开发者手册-Golang专题》电子版下载
本期以 Go 语言为主题,收纳阿里巴巴资深程序员语青、丛霄、蜂翅、赋行、路德、冀锋 6 位的优秀技术文章。精解 Go 语言开发应用、常见技术难点以及产品创新实践等,帮助更多开发者快速掌握 Go 语言核心架构及功能,高效解决问题,提升研发效率,在云原生的浪潮下扬帆起航!
147 0
《阿里开发者手册-Golang专题》电子版下载
|
Go 开发工具 git
golang下载gocolly/colly
git clone https://github.com/golang/net.git src/github.com/golang/netgit clone https://github.com/golang/sys.
1863 0
Golang 1.3 发布了。终于找地方下载了。
golang 1.3 早就发布了 但是golang.org的官方网站被屏蔽了下载不了。 终于找到一个镜像网站。 http://golang.so/ http://tip.golang.so/ golang的中文社区。 下载速度比较慢,但是还是可以下载的。
1734 0
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
111 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
66 4
Golang语言文件操作快速入门篇
|
2月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
101 3
Golang语言之gRPC程序设计示例
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
86 4