如何在go中获取多部分形式文件的文件名?

问题描述 投票:0回答:2

我正在尝试上传一个多部分表单,其中包含一个文件和一些其他数据。我知道我使用 FormFile 执行的文件的标签名称,但我也想获取文件的名称。我不知道该怎么做?

go multipart
2个回答
3
投票

在名为

form.html
的文件中给出这样的简单形式:

<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>File Upload example</title>
</head>

<body>
    <form action="/form-endpoint" method="post" enctype="multipart/form-data">
        <label for="file-input">Choose an image</label>
        <input type="file" id="file-input" name="file-input" accept="image/png, image/jpeg">
        <input type="submit" value="Submit">
    </form>
</body>

</html>

我可以使用 POST 请求的

*multipart.Reader
结构获取上传文件的文件名,就像在名为
main.go
:

的文件中一样
package main

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

func serveForm(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, "form.html")
}

func handleFormSubmit(w http.ResponseWriter, r *http.Request) {
    reader, err := r.MultipartReader()
    if err != nil {
        log.Fatalf("failed to create multipart-reader: %s", err)
    }

    for p, err := reader.NextPart(); err != io.EOF; p, err = reader.NextPart() {
        log.Println(p.FileName())  // This line in particular is what you're looking for.
    }
}

func main() {
    http.HandleFunc("/", serveForm)
    http.HandleFunc("/form-endpoint", handleFormSubmit)
    if err := http.ListenAndServe(":8000", nil); err != nil {
        log.Fatalf("failed to start server: %s", err)
    }
}

这是文档中了解更多有关

multipart/form-data
阅读的良好起点:https://golang.org/pkg/net/http/#Request.MultipartReader


0
投票

FormFile()
是一个方便的函数,它将返回要读取的文件及其标题,其中包含
Filename
Size
属性。

func handleFormSubmit(w http.ResponseWriter, r *http.Request) {
    f, fHeader, err := r.FormFile("file-input")
    if err != nil {
        panic(err)
    }
    
    // get the filename and size in bytes
    fmt.Fprintln(w, fmt.Sprintf("Your file name is %q, and it is %d bytes", fHeader.Filename, fHeader.Size))

    // read the file's data
    data, err := io.ReadAll(f)
    if err != nil {
        panic(err)
    }
    fmt.Fprintln(w, data)
}
© www.soinside.com 2019 - 2024. All rights reserved.