
正如摘要所述,http.Request的FormFile方法仅能获取表单中的第一个文件。要处理包含multiple="multiple"属性的<input type="file">元素上传的多个文件,我们需要深入解析MultipartForm。
FormFile函数是一个便捷方法,实际上,我们可以手动解析MultipartForm来获取我们需要的全部文件。以下是一个示例:
package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
)
func uploadHandler(w http.ResponseWriter, r *http.Request) {
// 设置最大内存限制,例如32MB
err := r.ParseMultipartForm(32 << 20)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 获取名为 "myfiles" 的文件列表
files := r.MultipartForm.File["myfiles"]
if len(files) == 0 {
fmt.Fprintln(w, "No files uploaded")
return
}
// 遍历文件列表
for _, fileHeader := range files {
// 打开文件
file, err := fileHeader.Open()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer file.Close()
// 创建保存文件的目标
dst, err := os.Create("./uploads/" + fileHeader.Filename)
if err != nil {
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: %s\n", fileHeader.Filename)
}
}
func main() {
// 创建 uploads 目录(如果不存在)
os.MkdirAll("./uploads", os.ModeDir|0755)
http.HandleFunc("/upload", uploadHandler)
fmt.Println("Server listening on port 8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}代码解释:
HTML表单示例:
立即学习“go语言免费学习笔记(深入)”;
<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="myfiles" multiple="multiple"><br><br>
<input type="submit" value="Upload">
</form>
</body>
</html>通过解析MultipartForm,我们可以轻松地处理HTML表单中的多文件上传。 示例代码提供了一个清晰的框架,开发者可以根据自己的需求进行修改和扩展。 请务必注意错误处理、文件大小限制和安全问题,以确保文件上传功能的稳定性和安全性。
以上就是Go语言处理多文件上传:解析MultipartForm的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号