1. 程式人生 > 程式設計 >go Http Post 傳送檔案流案例

go Http Post 傳送檔案流案例

我就廢話不多說了,大家還是直接看程式碼吧~

package main
import (
 "net/http"
 "net/url"
 "fmt"
 "io/ioutil"
 _ "io"
 "bytes"
)
func main() {
 postFile()
}
func post() {
  //這是一個Post 引數會被返回的地址
  strinUrl:="http://localhost:8080/aaa"`這裡寫程式碼片`
  resopne,err:= http.PostForm(strinUrl,url.Values{"num":{"456"},"num1":{"123"}})
  if err !=nil {
  fmt.Println("err=",err)
  }
  defer func() {
   resopne.Body.Close()
   fmt.Println("finish")
  }()
  body,err:=ioutil.ReadAll(resopne.Body)
  if err!=nil {
   fmt.Println(" post err=",err)
  }
  fmt.Println(string(body))
}
func postFile(){
 //這是一個Post 引數會被返回的地址
 strinUrl:="http://localhost:8080/aaa"
 byte,err:=ioutil.ReadFile("post.txt")
 resopne,err :=http.Post(strinUrl,"multipart/form-data",bytes.NewReader(byte))
 if err !=nil {
  fmt.Println("err=",err)
 }
 defer func() {
  resopne.Body.Close()
  fmt.Println("finish")
 }()
 body,err:=ioutil.ReadAll(resopne.Body)
 if err!=nil {
  fmt.Println(" post err=",err)
 }
 fmt.Println(string(body))
}

水滴石穿。這裡把Go Http Post 引數的函式也貼了處理主要對比兩者不同之處。

補充:golang爬蟲 模擬各種情況的post請求 檔案上傳

go實現各種型別的post請求

請求測試地址

var (
 requestPostURL string = "http://httpbin.org/post"
 // 接收檔案的服務自己實現qwq
 // 接收一張圖片上傳 postman的key file
 imagePostURL  string = "/imageUpload/upload"
 // 接收多張圖片上傳 postman的key file
 imageMultiPostURL string = "/imageUpload/uploads"
)

application/x-www-from-urlencoded

說明

application/x-www-from-urlencoded,會將表單內的資料轉換為鍵值對,比如,name=java&age = 23

示例

// 
func postXWwwFromURLEncoded() {
 client := http.Client{}
 // 不帶任何的請求資料post
 // req,err := http.NewRequest(http.MethodPost,requestPostURL,nil)
 // 帶資料
 urlValues := url.Values{}
 urlValues.Add("name","張三")
 urlValues.Add("age","18")
 reqBody := urlValues.Encode()
 req,strings.NewReader(reqBody))
 if err != nil {
 log.Println("err")
 }
 resp,err := client.Do(req)
 if err != nil {
 log.Println("err")
 }
 defer resp.Body.Close()
 b,err := ioutil.ReadAll(resp.Body)
 if err != nil {
 log.Println("err")
 }
 fmt.Println(string(b))
 // urlValues := url.Values{}
 // urlValues.Add("name","zhaofan")
 // urlValues.Add("age","22")
 // resp,_ := http.PostForm("http://httpbin.org/post",urlValues)
}

raw

說明

// 也就是入參方式為json

// 可以上傳任意格式的文字,可以上傳text、json、xml、html

示例

func postRaw() {
 client := http.Client{}
 // 帶資料 json 型別
 urlValues := map[string]interface{}{
 "name":  "jack","age":  18,"is_active": true,}
 b1,_ := json.Marshal(&urlValues)
 // b1,_ := json.Marshal(&urlValues)
 req,bytes.NewReader(b1))
 if err != nil {
 log.Println("err")
 }
 resp,err := ioutil.ReadAll(resp.Body)
 if err != nil {
 log.Println("err")
 }
 fmt.Println(string(b))
}

multipart/form-data 帶普通引數

說明

// multipart/form-data

// 既可以上傳檔案,也可以上傳鍵值對

// 上傳的欄位是檔案時,會有Content-Type來說明檔案型別;content-disposition

// 可以上傳多個檔案

示例

// multipart/form-data 帶普通引數 key-value
func postFormDataWithParams() {
 client := http.Client{}
 // 不帶任何的請求資料post
 body := &bytes.Buffer{}
 writer := multipart.NewWriter(body)
 params := map[string]string{
 "name": "zhangsan","age": "12",}
 for key,val := range params {
 _ = writer.WriteField(key,val)
 }
 writer.Close()
 req,body)
 if err != nil {
 log.Println("err")
 }
 resp,err := ioutil.ReadAll(resp.Body)
 if err != nil {
 log.Println("err")
 }
 fmt.Println(string(b))
}

multipart/form-data 上傳一個檔案

// key:file 裡面放一個檔案
// multipart/form-data 傳一個檔案
func postFormDataWithSingleFile() {
 client := http.Client{}
 bodyBuf := &bytes.Buffer{}
 bodyWrite := multipart.NewWriter(bodyBuf)
 file,err := os.Open("./images/img.jpg")
 defer file.Close()
 if err != nil {
 log.Println("err")
 }
 // file 為key
 fileWrite,err := bodyWrite.CreateFormFile("file","img.jpg")
 _,err = io.Copy(fileWrite,file)
 if err != nil {
 log.Println("err")
 }
 bodyWrite.Close() //要關閉,會將w.w.boundary刷寫到w.writer中
 // 建立請求
 contentType := bodyWrite.FormDataContentType()
 req,imagePostURL,bodyBuf)
 if err != nil {
 log.Println("err")
 }
 // 設定頭
 req.Header.Set("Content-Type",contentType)
 resp,err := ioutil.ReadAll(resp.Body)
 if err != nil {
 log.Println("err")
 }
 fmt.Println(string(b))
}

multipart/form-data 上傳多個檔案

// key:file 裡面放多個檔案
// multipart/form-data 傳多個檔案
func postFormDataWithMultipartFile() {
 client := http.Client{}
 bodyBuf := &bytes.Buffer{}
 bodyWrite := multipart.NewWriter(bodyBuf)
 images := []string{"img.jpg","img1.jpg"}
 for _,val := range images {
 file,err := os.Open("./images/" + val)
 defer file.Close()
 if err != nil {
 log.Println("err")
 }
 fileWrite,val)
 _,file)
 if err != nil {
 log.Println("err")
 }
 }
 bodyWrite.Close() //要關閉,會將w.w.boundary刷寫到w.writer中
 // 建立請求
 req,bodyBuf)
 if err != nil {
 log.Println("err")
 }
 // 設定頭
 contentType := bodyWrite.FormDataContentType()
 req.Header.Set("Content-Type",err := ioutil.ReadAll(resp.Body)
 if err != nil {
 log.Println("err")
 }
 fmt.Println(string(b))
}

binary

// Content-Type:application/octet-stream,從字面意思得知,只可以上傳二進位制資料,通常用來上傳檔案,
// 由於沒有鍵值,所以,一次只能上傳一個檔案
func postBinary() {
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。