Go 使用表單上傳單一檔案到 http web server範例。
範例環境:
- Go 1.18
表單
建立下面HTML表單來上傳檔案。
demo.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<form action="http://localhost:8080/upload"
method="POST"
enctype="multipart/form-data">
upload file:<input name="file" type="file"><br>
<input type="submit">
</form>
</body>
</html>
取得表單檔案
建立一個POST|/upload
API接收從表單上傳的檔案。將multipart.File
(繼承io.Reader
)利用io.Copy()
將內容複製到bytes.Buffer
繼承io.Writer
)後寫到專案根目錄下。
main.go
package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodPost:
file, header, err := r.FormFile("file") // get form file input
if err != nil {
panic(err)
}
defer file.Close()
buf := bytes.NewBuffer(nil)
_, err = io.Copy(buf, file)
if err != nil {
panic(err)
}
err = os.WriteFile(header.Filename, buf.Bytes(), 0666)
if err != nil {
panic(err)
}
fmt.Fprint(w, fmt.Sprintf("%v uploaded", header.Filename))
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
})
http.ListenAndServe(":8080", nil)
}
測試
啟動專案,在瀏覽器開啟表單並在欄位選擇要上傳的檔案,點選Submit上傳。例如上傳一個gopher.jpg
上傳後會返回"gopher.jpg upploaded",並在專案根目錄出現gopher.jpg
。
或用curl上傳檔案,發送請求如下。
curl -X POST "http://localhost:8080/upload" -H 'content-type: multipart/form-data' -F "file=@./gopher.jpg"
content-type
設為multipart/form-data
;上傳檔案使用-F "<name>=@<filepath>"
,<name>
為input名稱,範例為file
filepath
為上傳檔案的目錄位置,範例為執行curl同目錄下的gopher.jpg
。
$ curl -X POST "http://localhost:8080/upload" \
> -H 'content-type: multipart/form-data' \
> -F "file=@./gopher.jpg"
gopher.jpg uploaded
回應結果。
gopher.jpg uploaded
- Read multipart-form data as []byte in GO
- Golang 寫出文字檔
- Golang Web接收表單資料
- Golang Web接收表單資料及檔案
- Golang http POST form file
沒有留言:
張貼留言