使用 Go 处理 post 请求中的多个文件

Handle multiple files in post request with Go

提问人:Viktor Rozenko 提问时间:6/3/2020 更新时间:6/30/2021 访问量:1730

问:

我正在使用 Go 为音乐流媒体服务编写服务器端。我需要能够处理相册上传。我希望管理员能够转到 http://lisn.rocks/upload,选择一个必须包含 、 和一些歌曲文件的文件夹,单击上传,其余的由服务器处理。meta.jsoncover.jpg.mp3

这是我用来测试此功能的简单 HTML 页面:

<html>
    <head><title>Album Upload</title></head>
    <body>
        <form enctype="multipart/form-data" action="/upload" method="POST">
            <input type="file" name="album" webkitdirectory directory multiple> <br>
            <input type="submit" value="Upload">
        </form>
    </body>
</html>

我需要一个处理程序函数,它能够查看文件、检查其内容并根据那里的内容做一些事情。包含我需要的所有信息。现在,我不需要关于使用 Go 阅读 JSON 或与之相关的其他内容的广泛解释。meta.jsonmeta.json

我只需要将该文件夹中的所有文件作为单独的文件读取。相反,当我这样做时,Go 将它们全部视为一个文件字段。albumrequest.FormFile("album")

Go 文件上传 WebForms 服务器端

评论


答:

0赞 Burak Serdar 6/3/2020 #1

正如文档所说,它只返回第一个文件。提交表单时,该字段将是一个数组,您必须使用多部分流来处理每个单独的文件。FormFilealbum

rd, err:=request.MultipartReader()
for {
  part, err:=rd.NextPart()
  if err==io.EOF {
      break
  }
  data,err:=ioutil.ReadAll(part)
  fileName:=part.FileName()
  part.Close()
}

您需要添加错误处理和数据处理等。

1赞 jean davy Nizigama 6/30/2021 #2

可以使用请求结构的 MultipartForm 字段在 go 中处理多个文件上传。

    multipartFormData := req.MultipartForm

    for _, v := range multipartFormData.File["attachments"] {
        fmt.Println(v.Filename, ":", v.Size)
        uploadedFile, _ := v.Open()
        // then use the single uploadedFile however you want
        // you may use its read method to get the file's bytes into a predefined slice, 
        //here am just using an anonymous slice for the example
        uploadedFile.Read([]byte{})
        uploadedFile.Close()
    }