如何在go中获取多格式文件名?

mbskvtky  于 2023-11-14  发布在  Go
关注(0)|答案(2)|浏览(117)

我试图上传一个多部分的形式,其中有一个文件沿着与其他一些数据。我知道的标签名称的文件使用我做FormFile,但我想得到的文件的名称也。我不能够弄清楚如何做到这一点?

up9lanfz

up9lanfz1#

在一个名为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

wgeznvg7

wgeznvg72#

FormFile()是一个方便的函数,它将返回用于阅读的文件及其头部,其中包含FilenameSize属性。

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

字符串

相关问题