如何使用 go 的 net/http 或类似的替代方法保存在 multipart/form-data POST 请求中收到的文件?

How can I save the file received in a multipart/form-data POST request using go's net/http or similar alternative?

对于上下文,我正在尝试为程序 ShareX (https://getsharex.com/docs/custom-uploader) 创建一个自定义图像上传器。我尝试了很多搜索词,但是找不到这个问题的任何答案。

这是我当前的代码(位于文件 main.go 中):

package main

import (
    "fmt"
    "net/http"
)

func handleUpload(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(16384)
    f, fi, _ := r.FormFile("file_image")
    _ = f
    fmt.Println(fi.Filename, fi.Size)

}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/upload", handleUpload)
    fmt.Println("Starting listener on port 8085")
    http.ListenAndServe(":8085", mux)
}

我的目标是将从请求接收到的文件(图像)数据保存到本地文件,但是我无法做到这一点,因为写入文件需要类型 []bytef 的类型是 multipart.File.

这是一个如何处理表单数据的示例。

这里的主要思想是使用io pkg https://golang.org/pkg/io/

r.FormFile returns File 类型的接口。 File 实现了 ReaderWriter 方法。所以我们可以从一个文件中复制内容并将其写入一个空文件。

package main

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

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case "POST":
        r.ParseMultipartForm(10 << 20) //10 MB
        file, handler, err := r.FormFile("file_image")
        if err != nil {
            log.Println("error retrieving file", err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer file.Close()
        dst, err := os.Create(handler.Filename)
        if err != nil {
            log.Println("error creating file", err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer dst.Close()
        if _, err := io.Copy(dst, file); err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        fmt.Fprintf(w, "uploaded file")
    }
}

func main() {
    http.HandleFunc("/upload", uploadHandler)

    http.ListenAndServe(":8085", nil)
}