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