登录
首页 >  Golang >  Go问答

使用 Golang 的 net/http 或类似替代方案处理收到的 multipart/form-data POST 请求中的文件

来源:stackoverflow

时间:2024-02-23 22:36:24 106浏览 收藏

本篇文章向大家介绍《使用 Golang 的 net/http 或类似替代方案处理收到的 multipart/form-data POST 请求中的文件》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

就上下文而言,我正在尝试为 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)
}

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


解决方案


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

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

r.formfile 返回 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)
}

今天关于《使用 Golang 的 net/http 或类似替代方案处理收到的 multipart/form-data POST 请求中的文件》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>