如何在Golang上上传文件?
#forms #go #files

在此博客中,我将使用本机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个变量,filefile是上传的文件本身,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