午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > golang實現的文件上傳下載小工具

golang實現的文件上傳下載小工具

熱門標簽:鄭州智能語音電銷機器人價格 仙桃400電話辦理 寧波語音外呼系統公司 宿遷便宜外呼系統代理商 湛江crm外呼系統排名 地圖標注免費定制店 重慶慶云企業400電話到哪申請 上海極信防封電銷卡價格 不封卡外呼系統

前言

雖然現在文件上傳下載工具多如牛毛,比如http、ftp、sftp、scp等方案都可以用于文件傳輸,但都是需要安裝服務器甚至客戶端。
有一種場景是我只需要臨時上傳或下載一個文件,完了就不用服務器運行了,如果使用那些文件傳輸工具,不光安裝麻煩,開啟關閉也惱火額。
因此才想搞小工具,不過Python愛好者可以用python -m http.server 8080 --bind 192.168.1.100開啟文件服務器,對我來說還是麻煩。
已經上傳到【Github】,隨意鑒賞。

源碼鑒賞

模擬一個http服務器,通過curl和wget命令作為客戶端實現文件的上傳下載功能。
只是實現一個小工具,所以沒必要使用http庫了,我也試過用http庫來完成相同的功能,發現很多東西都用不上。
上傳和下載文件加入了進度顯示,方便知道上傳和下載進度。本來想實現斷點續傳功能,但比較懶,不想弄,原理很簡單。
想想還是把認證授權加上去,不然太不安全了,命令行更新了使用用戶名和密碼方式的上傳和下載。

package main
 
import (
  "bufio"
  "encoding/base64"
  "errors"
  "fmt"
  "io"
  "net"
  "net/url"
  "os"
  "path/filepath"
  "strconv"
  "strings"
  "unsafe"
)
 
func main() {
  if len(os.Args) != 3 {
    fmt.Printf(`usage: %s ip:port user:pass
 
get file:
 wget --auth-no-challenge --user=user --password=pass --content-disposition "http://ip:port?/home/tmp.txt"
 curl -u user:pass -OJ "http://ip:port?/home/tmp.txt"
post file:
 wget -qO - --auth-no-challenge --user=user --password=pass --post-file=C:\tmp.txt "http://ip:port?/home/tmp.txt"
 curl -u user:pass --data-binary @C:\tmp.txt "http://ip:port?/home/tmp.txt"
`, os.Args[0])
    return
  }
  addr, err := net.ResolveTCPAddr("tcp", os.Args[1])
  if err != nil {
    panic(err)
  }
  ser, err := net.ListenTCP("tcp", addr)
  if err != nil {
    panic(err)
  }
 
  fmt.Printf("Listen: [%s]\n", addr)
  authStr = "Basic " + base64.StdEncoding.EncodeToString([]byte(os.Args[2]))
  for {
    ln, err := ser.AcceptTCP()
    if err != nil {
      panic(err)
    }
    go func(l *net.TCPConn) {
      err := handleFile(l)
      if err != nil {
        respData(l, err.Error())
      }
      l.Close()
    }(ln)
  }
}
 
const (
  maxMemory = 10  20 // 緩存10MB
  respMsg  = "HTTP/1.1 200 OK\r\nContent-Type:text/plain;charset=utf-8\r\nContent-Disposition:attachment;filename=resp.txt\r\nContent-Length:%d\r\n\r\n%s"
  getHeader = "HTTP/1.1 200 OK\r\nContent-Type:application/octet-stream\r\nContent-Disposition:attachment;filename=%s\r\nContent-Length:%d\r\nContent-Transfer-Encoding:binary\r\n\r\n"
)
 
var authStr string // 授權信息
 
func respData(w io.Writer, data string) {
  msg := data + "\r\n"
  fmt.Fprintf(w, respMsg, len(msg), msg)
}
 
func handleFile(l *net.TCPConn) error {
  br := bufio.NewReaderSize(l, maxMemory)
  method, path, length, err := getHeaderMsg(br)
  if err != nil {
    return err
  }
  fmt.Printf("[%s - %s - %d]\n", method, path, length)
 
  if method == "GET" {
    return httpGetFile(path, l, length)
  }
  err = httpPostFile(path, br, length)
  if err != nil {
    return err
  }
  respData(l, "post ok")
  return nil
}
 
// 內存復用,更快速,省內存
func bytesToString(b []byte) string {
  return *(*string)(unsafe.Pointer(b))
}
 
func getHeaderMsg(r *bufio.Reader) (string, string, int64, error) {
  // 讀取第一行,提取有用信息
  line, _, err := r.ReadLine()
  if err != nil {
    return "", "", 0, err
  }
  header := strings.Fields(bytesToString(line))
  if len(header)  3 { // 首行至少3列數據
    return "", "", 0, errors.New("header error")
  }
  method, path := header[0], ""
 
  s := strings.Index(header[1], "?")
  if s >= 0 {
    path, _ = url.QueryUnescape(header[1][s+1:])
  }
  if path == "" { // ?號后面就是文件路徑,需要解碼url一下
    return "", "", 0, errors.New("path error")
  }
 
  var length int64
  if method == "GET" {
    fi, err := os.Stat(path)
    if err != nil {
      return "", "", 0, err
    }
    length = fi.Size() // GET請求提前得到文件大小
  } else if method != "POST" {
    return "", "", 0, errors.New(method + " not support")
  }
 
  var authCheck string
  for {
    line, _, err = r.ReadLine()
    if err != nil {
      return "", "", 0, err
    }
    if len(line) == 0 {
      break // 遇到空行,之后為請求體
    }
    header = strings.Split(bytesToString(line), ":")
    if len(header) == 2 { // 頭部[key: val]解析
      header[0] = strings.ToLower(strings.TrimSpace(header[0]))
      header[1] = strings.TrimSpace(header[1])
      if method == "POST"  header[0] == "content-length" {
        length, _ = strconv.ParseInt(header[1], 10, 64)
      } else if header[0] == "authorization" {
        authCheck = header[1]
      }
    }
  }
  if authCheck != authStr {
    return "", "", 0, errors.New("authorization error")
  }
  return method, path, length, nil
}
 
func httpPostFile(path string, r io.Reader, length int64) error {
  fw, err := os.Create(path)
  if err != nil {
    return err
  }
  defer fw.Close()
  pr := newProgress(r, length)
  _, err = io.CopyN(fw, pr, length)
  pr.Close()
  return err
}
 
func httpGetFile(path string, w io.Writer, size int64) error {
  fr, err := os.Open(path)
  if err != nil {
    return err
  }
  defer fr.Close()
  fmt.Fprintf(w, getHeader, filepath.Base(path), size)
  pr := newProgress(fr, size)
  _, err = io.Copy(w, pr)
  pr.Close()
  return err
}
 
type progress struct {
  r  io.Reader
  cnt int64
  rate chan int64
}
 
func newProgress(r io.Reader, size int64) io.ReadCloser {
  p := progress{r: r, rate: make(chan int64)}
  // 之所以這樣做進度,是因為打印耗性能,因此在協程中打印進度
  // 在處理數據中用非阻塞方式往chan中傳處理字節數
  go func(rate -chan int64, all int64) {
    for cur := range rate {
      fmt.Printf("\rhandle:%4d%%", cur*100/all)
    }
    fmt.Printf("\rhandle: 100%%\r\n\r\n")
  }(p.rate, size)
  return p
}
 
func (p *progress) Read(b []byte) (int, error) {
  n, err := p.r.Read(b)
  p.cnt += int64(n)
  select { // 非阻塞方式往chan中寫數據
  case p.rate - p.cnt:
  default:
  }
  return n, err
}
 
func (p *progress) Close() error {
  close(p.rate) // 關閉chan,通知打印協程退出
  return nil
}

食用方法

執行UpDownFile-h可以查看幫助文檔,里面有wget和curl上傳和下載文件的命令,方便忘記命令的時候copy一下下。
工具雖小,但確實解決了我個人的臨時上傳下載文件需求,再也不用到處安裝各種服務器咯,爽爽噠。

usage: UpDownFile ip:port
 
get file:
 wget --auth-no-challenge --user=user --password=pass --content-disposition "http://ip:port?/home/tmp.txt"
 curl -u user:pass -OJ "http://ip:port?/home/tmp.txt"
post file:
 wget -qO - --auth-no-challenge --user=user --password=pass --post-file=C:\tmp.txt "http://ip:port?/home/tmp.txt"
 curl -u user:pass --data-binary @C:\tmp.txt "http://ip:port?/home/tmp.txt"

以上就是golang實現的文件上傳下載小工具的詳細內容,更多關于golang實現文件上傳下載的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • golang語言實現的文件上傳與文件下載功能示例
  • Golang實現異步上傳文件支持進度條查詢的方法
  • Golang+Android基于HttpURLConnection實現的文件上傳功能示例
  • golang簡單獲取上傳文件大小的實現代碼
  • Golang實現http文件上傳小功能的案例

標簽:安康 海南 物業服務 遼寧 西雙版納 電子產品 青海 儋州

巨人網絡通訊聲明:本文標題《golang實現的文件上傳下載小工具》,本文關鍵詞  golang,實現,的,文件,上傳下載,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang實現的文件上傳下載小工具》相關的同類信息!
  • 本頁收集關于golang實現的文件上傳下載小工具的相關信息資訊供網民參考!
  • 推薦文章
    天堂蜜桃91精品| 色撸撸在线视频| 色噜噜狠狠色综合中国| 91麻豆免费视频网站| 亚洲精品一区二区毛豆| 日韩毛片在线看| 久久夜色精品国产噜噜av| 人妻av无码一区二区三区| 中文字幕av不卡| 99蜜桃臀久久久欧美精品网站| 欧美日韩视频在线| 懂色av粉嫩av蜜乳av| 久久99精品视频一区97| 精品国产av鲁一鲁一区| 日韩在线视频免费观看| 国产精品免费无码| 欧美一区二区三区精品| 啪啪小视频网站| 美女久久久久久久| 亚洲精华国产精华精华液网站| 91精品视频免费观看| 亚洲一区二区在线视频| 在线观看国产小视频| 男人天堂网站在线| 黑人巨大精品欧美一区二区一视频| 色欲AV无码精品一区二区久久 | 国产一区一区三区| 色综合久久久久网| 99热在线观看精品| 日韩一区和二区| 日本美女视频网站| 正在播放亚洲一区| 人人草在线观看| 91手机视频在线观看| 国产高清成人在线| 男生操女生视频在线观看| 国产91亚洲精品| 91久久精品日日躁夜夜躁国产| eeuss中文| 亚洲一区二区三区精品视频| 日韩成人在线观看| 国产精品香蕉一区二区三区| 天堂av在线8| 亚洲娇小娇小娇小| 精品一区中文字幕| 成人黄色在线免费观看| 香蕉久久久久久av成人| 在线观看日韩一区| 亚洲欧美激情一区二区三区| 欧美在线视频不卡| 婷婷六月天在线| 亚洲国产成人porn| 一个色综合久久| 福利微拍一区二区| 一区二区三区四区影院| 欧美日韩国产经典色站一区二区三区 | 热久久久久久久久| 婷婷开心久久网| 俄罗斯女人裸体性做爰| 日韩三级高清在线| 免费黄色国产视频| 日韩成人在线播放| 国产一级淫片a视频免费观看| 欧美一区二区三区影视| ass极品国模人体欣赏| 日韩av在线看| 国产成年人免费视频| 亚洲丁香婷深爱综合| 免费在线观看黄色小视频| 中文在线不卡视频| 在线观看国产精品视频| 国产精品精品视频一区二区三区| 日韩精品一二三区| 国产97在线|亚洲| 精品黑人一区二区三区国语馆| 91九色视频导航| 成人一道本在线| 欧美在线观看www| 国产色91在线| 天天干天天综合| 欧美一区二区三区成人| 久久久久久激情| 久久久久久久久久国产精品| 久久综合激情| 在线不卡视频一区二区| 亚洲图片欧美色图| 中文字幕在线观看免费高清| 久久夜色精品国产欧美乱| 人妻丰满熟妇av无码区hd| 97av在线播放| 亚洲天堂中文在线| 亚洲一区国产精品| 免费久久99精品国产| 日本亚洲自拍| 国产精品国产自产拍高清av | 精品欧美乱码久久久久久1区2区| 丰满少妇一区二区三区| 久久精品国产久精国产思思| 天堂av2024| 亚洲色图都市激情| 精品视频全国免费看| 麻豆成人在线视频| 成人在线一区二区| 久久九九久久九九| 国产精品成人99一区无码| 亚洲色图25p| 久久一二三四| 成年人视频大全| 欧美一级电影网站| 国产精品热久久| 亚洲国产午夜伦理片大全在线观看网站 | 蜜臀精品一区二区三区| 精品综合久久久| 亚洲一区二区在线免费看| 加勒比综合在线| 国产精品伦子伦免费视频| 成人h精品动漫一区二区三区| 91精品999| 久久成年人免费电影| 国产传媒日韩欧美成人| 波多野结衣三级视频| 欧美xxxx18性欧美| 久久精品国产99| 亚欧激情乱码久久久久久久久| 色综合影院在线| 国产激情一区二区三区桃花岛亚洲| 少妇性l交大片7724com| 久久免费视频这里只有精品| 亚洲精品国产精品国| 水蜜桃在线免费观看| 欧美日韩电影一区| 亚洲精品一区二区三区区别| 老太脱裤让老头玩ⅹxxxx| 亚洲色图欧美制服丝袜另类第一页| 丝瓜av网站精品一区二区 | 久久久久久18| 亚洲国产精品ⅴa在线观看| 蜜桃av.com| 久久国产精品一区二区三区四区| 欧美性猛片xxxx免费看久爱| 国产丰满美女做爰| 久久久久狠狠高潮亚洲精品| 国产视频精品免费播放| 亚洲人成色777777老人头| 奇米777在线视频| 日本精品久久久久影院| 一区二区三区在线播| 欧美日韩综合一区二区三区| 亚洲人成77777| 亚洲美女av在线播放| 喷水一区二区三区| 国产一级二级在线观看| 91国产在线免费观看| 亚洲午夜久久久久久久久电影网| 国产精品午夜一区二区| 日韩国产欧美亚洲| 欧美精品久久久久a| 中文字幕一区二区视频| 亚洲乱码国产乱码精品| 日韩免费一级视频| 欧美黑人xxxx| 国产精品人人做人人爽人人添| 在线观看亚洲欧美| 日韩精品在线视频免费观看| 欧美猛交免费看| 亚洲色大成网站www久久九九| 亚洲欧美一区二区三区在线观看| 欧美极品欧美精品欧美| 午夜精品久久久久久久99热浪潮| 国产精品久久久久天堂| 中文字幕在线网站| 麻豆三级在线观看| 91色p视频在线| 日韩一区二区精品在线观看| 国产最新精品免费| 亚洲欧美一区二区三区四区五区| 男人天堂新网址| 欧美丰满老妇厨房牲生活 | 亚洲国产精品国自产拍av秋霞 | 亚洲不卡的av| 自拍视频一区二区三区| 欧美成人精品一区二区| 亚洲成av人综合在线观看| 日韩一卡二卡在线| 国产黄片一区二区三区| 中文字幕一区二区三区在线乱码 | 欧美性xxxxx| 精品一区二区三区视频| 欧美极品aaaaabbbbb| 精品人妻一区二区三区四区在线 | 欧洲精品久久| 欧美成人在线免费视频| 欧美视频在线看| 黄色小说综合网站| 国产一级中文字幕| 8x8x成人免费视频| 欧美日韩成人一区二区三区| 精品国产欧美成人夜夜嗨| 中文字幕 久热精品 视频在线| 亚洲第一视频在线| 美国黄色特级片| 黄色免费视频大全| 91精品久久久久久久久久久| 伊人一区二区三区| 日本网站在线观看一区二区三区| 久久久久亚洲av片无码| 香港三级韩国三级日本三级| 亚洲精品女av网站| 中文字幕久热精品在线视频| 五月综合激情网| 成人一区二区三区视频| 91精品人妻一区二区三区果冻| 污片免费在线观看| 免费特级黄色片| 成人一区二区电影| 色噜噜狠狠狠综合曰曰曰88av| 91福利国产精品| 国产亚洲精品bt天堂精选| 久久久久久穴| 激情五月婷婷在线| 国产清纯白嫩初高中在线观看性色| 欧美极品一区| 国产精品福利网站| 在线视频亚洲欧美| 欧美精品免费视频| 一区二区三区资源| 国产69精品久久99不卡| 国产精品爽爽久久| 免费观看特级毛片| 久久久久久综合网| 久久综合久久网| 免费在线观看一区二区| 亚洲精品色婷婷福利天堂| 丁香五六月婷婷久久激情| 2020日本不卡一区二区视频| 久久婷婷av| 无码视频在线观看| 激情五月激情综合| 美女扒开腿免费视频| 欧美国产激情视频| 杨幂一区欧美专区| 不卡av在线网站| 日韩精品www| 5858s免费视频成人| 午夜欧美一区二区三区在线播放| 国产精品911| 日本久久一级片| 国产中年熟女高潮大集合| 国产精品333| 五月天亚洲综合情| 欧美激情论坛| 大量国产精品视频| 亚洲色图狂野欧美| 欧美日韩日日骚| 色婷婷亚洲综合| 亚洲成人一区在线| 亚洲乱码中文字幕| 国产精品久久久久影院老司| 久久蜜臀精品av| 99精品一区二区三区| 久久精品国产成人一区二区三区| 色呦呦视频在线| 成人爽a毛片一区二区| 国产日韩一级片| 一级片免费网址| 天堂网一区二区三区| 国产一级一片免费播放放a| 日韩成人毛片视频| 粉嫩av性色av蜜臀av网站| 亚洲国产日韩一区无码精品久久久| 美女黄色一级视频| 国产精品日日摸夜夜爽| 国产视频一区二区三区在线播放 | 欧美在线视频观看| 琪琪亚洲精品午夜在线| 9.1国产丝袜在线观看| 国产91精品久久久久| 68精品久久久久久欧美 | free性中国hd国语露脸| 久久亚洲AV成人无码国产野外 | 亚洲综合国产精品| 国产亚洲一区二区三区在线播放| 国产成人看片| 久久综合伊人77777麻豆| 欧美精品一区二区三区在线四季| 日韩.欧美.亚洲| 美乳视频一区二区| 亚洲国产一区在线| 久久亚洲精品无码va白人极品| 青青青在线视频播放| 欧美私人情侣网站| 天天色天天综合网| 亚洲一二三四五| 一区二区精品免费| a在线视频播放观看免费观看| 日韩伦人妻无码| 国产精品久久影视| 亚洲在线免费观看视频| 亚洲成人黄色片| 日本伊人色综合网| 国产一区二区三区在线观看免费视频 | 国产精品美女在线观看| eeuss一区二区三区| 手机成人在线| 免费超爽大片黄| 国产视频手机在线播放| 国产xxxx视频| 久久一区二区三| 亚洲成熟少妇视频在线观看| 精品免费久久久| 久久电影网电视剧免费观看| 成人晚上爱看视频| 亚洲精品中文在线| 欧美探花视频资源| 欧美不卡一区二区三区| 亚洲精品久久久久中文字幕欢迎你| 在线观看日韩毛片| 亚洲电影天堂av| 久久av在线看| 91亚洲精品久久久| 伊人久久大香线蕉综合75| 男人透女人免费视频| 一级国产黄色片| 朝桐光av一区二区三区| 91视频综合网| 国产熟女一区二区三区四区| 国产乱码字幕精品高清av| 亚洲色图欧美激情| 制服丝袜在线91| 久久久精品日本| 不卡的av一区| 成人午夜免费剧场| 亚洲人辣妹窥探嘘嘘| 日韩一级av毛片| 国产亲伦免费视频播放| 高清视频一区二区| 精品久久久久久亚洲国产300| 亚洲精品美女久久久| 国产精品成人v| 黄色一级片网址| 日韩大尺度视频| 4438国产精品一区二区| 麻豆高清免费国产一区| 亚洲三级电影网站| 亚洲国产日韩欧美综合久久 | 最新中文字幕一区二区三区| 欧美一级免费大片| 日韩在线观看你懂的| 91久久综合亚洲鲁鲁五月天| 男人插女人视频在线观看| 色哟哟精品观看| 国产特级aaaaaa大片| 久久久亚洲精品一区二区三区| 欧美巨大另类极品videosbest| 精品国内亚洲在观看18黄| 国产乱人伦精品一区二区| 激情视频免费网站| 久久露脸国语精品国产91| 国模大尺度一区二区三区| 欧美性色视频在线| 中文字幕无线精品亚洲乱码一区| 国产在线视频欧美一区二区三区| 亚洲18在线看污www麻豆| 亚洲另类在线观看| 国产成人av一区二区三区在线观看| 欧美在线观看视频一区二区三区| 国内外成人免费激情在线视频网站| 一区一区视频| 日韩一区二区a片免费观看| 日本高清视频网站| 亚洲va欧美va国产va天堂影院| 日韩在线视频网| 午夜精品视频在线观看一区二区| 青青草视频网站| 97久久人国产精品婷婷| 1024成人网| 中文字幕在线看视频国产欧美| 欧美日本亚洲| 天天躁日日躁狠狠躁av麻豆男男| 一二三区免费视频| 久久精品一级爱片| 亚洲精品成人网| 九色综合日本| 四虎永久免费影院| 青青草97国产精品免费观看 | 丰满少妇被猛烈进入一区二区| 国产凹凸在线观看一区二区| 在线观看av一区| 国产精品一区二区久久久| 中文字幕 91| 中文字幕免费高清在线观看| 亚洲精品视频观看| 久久久久久久久久国产| www.av91| 精品无码m3u8在线观看| 久久综合给合久久狠狠狠97色69| 日韩视频在线观看一区二区| 成人免费视频视频在| mm131美女视频| 精品一区二区在线播放| 在线播放一区二区三区| 久久国产手机看片| 女人裸体性做爰全过| 成人av网址在线观看| 国产一区二区三区四区福利| 只有这里有精品| 中文在线观看免费视频| 久久狠狠亚洲综合| 国产午夜精品理论片a级探花| 黄色一级视频播放|