AdSense

網頁

2022/6/10

Golang 表單上傳檔案到 HTTP Web Server

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)
}

github


測試

啟動專案,在瀏覽器開啟表單並在欄位選擇要上傳的檔案,點選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名稱,範例為filefilepath為上傳檔案的目錄位置,範例為執行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


沒有留言:

AdSense