使用MultipartRequest上传文件

时间:2019-10-08 03:07:00

标签: go goa

我正在使用Goa v3设计一个终结点,该终结点使我可以通过multipart/form-data POST请求上传文件(更确切地说,图像)。 我声明了以下Service

var _ = Service("images", func() {
    HTTP(func() {
        Path("/images")
    })

    Method("upload", func() {  
        HTTP(func() {
            POST("/")
            MultipartRequest()
        })

        Payload(func() {
            Description("Multipart request Payload")
            Attribute("File", Bytes, "File")
        })

        Result(ImageList)
    })
})

我运行goa gengoa example命令来生成样板代码。除了cmd目录之外,example代码还会生成images.go主文件和multipart.go文件,以声明编码器和解码器逻辑,例如:

func ImagesUploadDecoderFunc(mr *multipart.Reader, p **images.UploadPayload) error {
    // Add multipart request decoder logic here
    return nil
}

我可以使用mr.NextPart()并显然获得对图像文件的引用,但是我仍然不确定如何将其映射到Bytes类型的images.UploadPayload字段中(或者也许我应该声明另一种类型的字段来处理文件?)。

我在Goa文档中找不到任何示例。

1 个答案:

答案 0 :(得分:0)

好吧,我终于了解了 |-id (key)-|- field_type -|- user_id -|- value ---------| | 1 | username | 1 | Joe | | 2 | city | 1 | Albany | | 3 | state | 1 | NY | | 4 | username | 2 | Bob | | 5 | city | 2 | Toledo | | 6 | state | 2 | OH | | 7 | location | 1 | Albany, NY | | 8 | location | 2 | Toledo, OH |的工作原理,并提出了解决方案。

首先,让我们澄清一下,与果阿通常的工作方式不同(使用multipart.Reader字段“自动”映射请求参数),使用Payload,我必须自己进行映射,因此MultipartRequest()实际上可以具有任何结构。

就我而言,我重新定义了Payload结构,如下所示:

Payload

简而言之,我想支持上传多个文件,每个文件都有其mime类型,文件名和数据。

为此,我实现了// ImageUpload single image upload element var ImageUpload = Type("ImageUpload", func() { Description("A single Image Upload type") Attribute("type", String) Attribute("bytes", Bytes) Attribute("name", String) }) // ImageUploadPayload is a list of files var ImageUploadPayload = Type("ImageUploadPayload", func() { Description("Image Upload Payload") Attribute("Files", ArrayOf(ImageUpload), "Collection of uploaded files") }) 解码器功能,如下所示:

multipart.go