как получить имя файла multipart-form в go? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь загрузить многочастную форму, в которой есть файл вместе с некоторыми другими данными. Я знаю имя тега для файла, с помощью которого я делаю FormFile, но я хочу также получить имя файла. Я не могу понять, как это сделать?

1 Ответ

2 голосов
/ 01 апреля 2020

Учитывая простую форму, подобную этой, в файле с именем 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>

Я могу получить имя загруженного файла, используя структуру *multipart.Reader запроса POST, как в файле с именем 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

...