在此博客中,我将使用本机Golang HTTP软件包上传文件,没有第三方软件包。我们将看到如何上传单个文件和多个文件。
HTML形式
表格简单明了。唯一要注意的是enctype="multipart/form-data"
属性。这是上传文件所必需的。
<form action="/upload" method="POST" enctype="multipart/form-data">
<input name="name" type="text" placeholder="name" />
<input name="ok" type="checkbox" placeholder="ok" value="aaaaa" /> aaaaa
<input name="ok" type="checkbox" placeholder="ok" value="bbbbbb" /> bbbbbb
<input type="file" name="file" id="file" />
<button type="submit">SUBMIT!</button>
</form>
单个文件上传
func uploadSingleFile(w http.ResponseWriter, r *http.Request){
file, header, _ := r.FormFile("file")
defer file.Close()
// create a destination file
dst, _ := os.Create(filepath.Join("./", header.Filename))
defer dst.Close()
// upload the file to destination path
nb_bytes, _ := io.Copy(dst, file)
fmt.Println("File uploaded successfully")
}
ðâ注意:所有的_
下划线变量都是错误,我只是为了简单起见而忽略了它们。所以不要在生产中这样做。
您注意到,我们获得了带有r.FormFile("input_name_here")
函数的上传文件,它返回3个变量,file
,file
是上传的文件本身,header
,其中包含有关文件,名称,size,mime类型等的信息,可以在上传之前使用这些信息来验证文件,最后是_
,这是错误。
多个文件上传
首先,在选择多个文件之前,您需要将multiple
属性添加到文件输入
func uploadMultipleFiles(w http.ResponseWriter, r *http.Request){
// key = "file" in the form
for key, files := range r.MultipartForm.File {
for _, file := range files {
dst, _ := os.Create(filepath.Join("./", file.Filename))
f, _ := file.Open()
io.Copy(dst, f)
}
}
}
仅供参考,r.MultipartForm.File
是一个map[string][]*multipart.FileHeader
,其中键是表单中输入的名称。 file
变量包含与单个文件上传示例中的header
变量相同的信息(大小,名称,哑剧类型等...)
其他字段
要获取其他字段,有两个选项,在某个时候您需要使用它们。
// OPTION 1: returns a string which is the first value of the key
r.FormValue("name") // string
// OPTION 2: returns a slice of strings of all the values of the key
r.MultipartForm.Value["name"] // map[string][]string
您可以在要获得一个值时使用第一个选项,而在要获得多个值时的第二个选项,在我们的情况下,复选框可以具有多个值。
所以r.FormValue("name")
就像做r.MultipartForm.Value["name"][0]
。
就是这样,希望您喜欢本教程。该博客最初发布在我的blog
上