golang http client如何上傳和server如何接收文件

給了一個例子,利用mime/multipart來實現(xiàn)client如何上傳一個文件到server,然后server如何接受這個文件。

看server.go代碼

package main

import (
    "io"
    "os"
    "fmt"
    "io/ioutil"
    "net/http"
)

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    reader, err := r.MultipartReader()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    for {
        part, err := reader.NextPart()
        if err == io.EOF {
            break
        }

        fmt.Printf("FileName=[%s], FormName=[%s]\n", part.FileName(), part.FormName())
        if part.FileName() == "" {  // this is FormData
            data, _ := ioutil.ReadAll(part)
            fmt.Printf("FormData=[%s]\n", string(data))
        } else {    // This is FileData
            dst, _ := os.Create("./" + part.FileName() + ".upload")
            defer dst.Close()
            io.Copy(dst, part)
        }
    }
}

func main() {
    http.HandleFunc("/upload", uploadHandler)
    http.ListenAndServe(":8080", nil)
}

例子1:client 上傳一個文件

package main

import (
    "io"
    "os"
    "log"
    "bytes"
    "io/ioutil"
    "net/http"
    "mime/multipart"
)

func main() {
    bodyBuffer := &bytes.Buffer{}
    bodyWriter := multipart.NewWriter(bodyBuffer)

    fileWriter, _ := bodyWriter.CreateFormFile("files", "file.txt")

    file, _ := os.Open("file.txt")
    defer file.Close()

    io.Copy(fileWriter, file)

    contentType := bodyWriter.FormDataContentType()
    bodyWriter.Close()

    resp, _ := http.Post("http://localhost:8080/upload", contentType, bodyBuffer)
    defer resp.Body.Close()

    resp_body, _ := ioutil.ReadAll(resp.Body)

    log.Println(resp.Status)
    log.Println(string(resp_body))
}

例子2:client上傳多個文件

package main

import (
    "io"
    "os"
    "log"
    "bytes"
    "io/ioutil"
    "net/http"
    "mime/multipart"
)

func main() {
    bodyBuffer := &bytes.Buffer{}
    bodyWriter := multipart.NewWriter(bodyBuffer)

    // file1
    fileWriter1, _ := bodyWriter.CreateFormFile("files", "file1.txt")
    file1, _ := os.Open("file1.txt")
    defer file1.Close()
    io.Copy(fileWriter1, file1)

    // file2
    fileWriter2, _ := bodyWriter.CreateFormFile("files", "file2.txt")
    file2, _ := os.Open("file2.txt")
    defer file2.Close()
    io.Copy(fileWriter2, file2)

    contentType := bodyWriter.FormDataContentType()
    bodyWriter.Close()

    resp, _ := http.Post("http://localhost:8080/upload", contentType, bodyBuffer)
    defer resp.Body.Close()

    resp_body, _ := ioutil.ReadAll(resp.Body)

    log.Println(resp.Status)
    log.Println(string(resp_body))
}

例子3:上傳其他Form數(shù)據(jù)

package main

import (
    "io"
    "os"
    "log"
    "bytes"
    "io/ioutil"
    "net/http"
    "mime/multipart"
)

func main() {
    bodyBuffer := &bytes.Buffer{}
    bodyWriter := multipart.NewWriter(bodyBuffer)

    // file1
    fileWriter1, _ := bodyWriter.CreateFormFile("files", "file1.txt")
    file1, _ := os.Open("file1.txt")
    defer file1.Close()
    io.Copy(fileWriter1, file1)

    // file2
    fileWriter2, _ := bodyWriter.CreateFormFile("files", "file2.txt")
    file2, _ := os.Open("file2.txt")
    defer file2.Close()
    io.Copy(fileWriter2, file2)

    // other form data
    extraParams := map[string]string{
        "title":       "My Document",
        "author":      "Matt Aimonetti",
        "description": "A document with all the Go programming language secrets",
    }
    for key, value := range extraParams {
        _ = bodyWriter.WriteField(key, value)
    }

    contentType := bodyWriter.FormDataContentType()
    bodyWriter.Close()

    resp, _ := http.Post("http://localhost:8080/upload", contentType, bodyBuffer)
    defer resp.Body.Close()

    resp_body, _ := ioutil.ReadAll(resp.Body)

    log.Println(resp.Status)
    log.Println(string(resp_body))
}

看server端的運(yùn)行輸出:

$ go build server.go && ./server
FileName=[file1.txt], FormName=[files]
FileName=[file2.txt], FormName=[files]
FileName=[], FormName=[description]
FormData=[A document with all the Go programming language secrets]
FileName=[], FormName=[title]
FormData=[My Document]
FileName=[], FormName=[author]
FormData=[Matt Aimonetti]

$ ls -l
total 25180
-rwxr-xr-x 1 ... 6179399 Jun 22 08:07 client
-rw-r--r-- 1 ...    1952 Jun 22 08:06 client.go
-rw-r--r-- 1 ...      15 Jun 22 07:11 file1.txt
-rw-r--r-- 1 ...      15 Jun 22 08:28 file1.txt.upload
-rw-r--r-- 1 ...      14 Jun 22 07:11 file2.txt
-rw-r--r-- 1 ...      14 Jun 22 08:28 file2.txt.upload
-rw-r--r-- 1 ...      15 Jun 22 07:56 file.txt
-rw-r--r-- 1 ...      15 Jun 22 08:10 file.txt.upload
-rwxr-xr-x 1 ... 6717437 Jun 22 07:59 server
-rw-r--r-- 1 ...    1580 Jun 22 07:58 server.go
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子详羡,更是在濱河造成了極大的恐慌,老刑警劉巖嘿悬,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件实柠,死亡現(xiàn)場離奇詭異,居然都是意外死亡善涨,警方通過查閱死者的電腦和手機(jī)窒盐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钢拧,“玉大人蟹漓,你說我怎么就攤上這事≡茨冢” “怎么了葡粒?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我嗽交,道長伯铣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任轮纫,我火速辦了婚禮,結(jié)果婚禮上焚鲜,老公的妹妹穿的比我還像新娘掌唾。我一直安慰自己,他們只是感情好忿磅,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布糯彬。 她就那樣靜靜地躺著,像睡著了一般葱她。 火紅的嫁衣襯著肌膚如雪撩扒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天吨些,我揣著相機(jī)與錄音搓谆,去河邊找鬼。 笑死豪墅,一個胖子當(dāng)著我的面吹牛泉手,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偶器,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斩萌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屏轰?” 一聲冷哼從身側(cè)響起颊郎,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霎苗,沒想到半個月后姆吭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叨粘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年猾编,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片升敲。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡答倡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驴党,到底是詐尸還是另有隱情瘪撇,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站倔既,受9級特大地震影響恕曲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渤涌,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一佩谣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧实蓬,春花似錦茸俭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酌伊,卻和暖如春腾窝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背居砖。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工虹脯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奏候。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓归形,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鼻由。 傳聞我的和親對象是個殘疾皇子暇榴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容