Skip to content

Instantly share code, notes, and snippets.

@Jimeux
Created November 26, 2018 09:56
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save Jimeux/22caf548107d21c884f8b94f8de05a02 to your computer and use it in GitHub Desktop.
package main
import (
"bytes"
"io"
"log"
"mime/multipart"
"net/http"
"os"
)
func main() {
url := "http://localhost:3000/upload"
fieldname := "file"
filename := "hello.txt"
file, err := os.Open(filename)
handleError(err)
// リクエストボディのデータを受け取るio.Writerを生成する。
body := &bytes.Buffer{}
// データのmultipartエンコーディングを管理するmultipart.Writerを生成する。
// ランダムなbase-16バウンダリが生成される。
mw := multipart.NewWriter(body)
// ファイルに使うパートを生成する。
// ヘッダ以外はデータは書き込まれない。
// fieldnameとfilenameの値がヘッダに含められる。
// ファイルデータを書き込むio.Writerが返却される。
fw, err := mw.CreateFormFile(fieldname, filename)
// fwで作ったパートにファイルのデータを書き込む
_, err = io.Copy(fw, file)
handleError(err)
// リクエストのContent-Typeヘッダに使う値を取得する(バウンダリを含む)
contentType := mw.FormDataContentType()
// 書き込みが終わったので最終のバウンダリを入れる
err = mw.Close()
handleError(err)
// contentTypeとbodyを使ってリクエストを送信する
resp, err := http.Post(url, contentType, body)
handleError(err)
err = resp.Body.Close()
handleError(err)
}
func handleError(err error) {
if err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment