Go语言 如何在postman ->form-data中传递json

vbopmzt1  于 2023-04-27  发布在  Go
关注(0)|答案(1)|浏览(237)

我有一个用go、gin和libpq编写的应用程序这个应用程序连接到一个azure存储帐户,可以列出容器/blob,删除blob和创建新的blob
问题是当我需要插入新的blob时,当在Azure容器中插入blob时,我还需要将这些blob的数据插入数据库中,我需要更具体地输入blob的名称(这将是一个随机的uuid)我的代码:

func NewBlob() gin.HandlerFunc {
    return func(c *gin.Context) {
        err := godotenv.Load(".env")
        if err != nil {
            log.Println("Erro ao carregar variavel de ambiente", err)
            c.JSON(http.StatusInternalServerError, gin.H{
                "Erro ao carregar variavel de ambiente": err,
            })
            return
        }

        accountKey := os.Getenv("ACCOUNTKEY")
        storageAccountName := os.Getenv("ACCOUNTNAME")
        containerName := os.Getenv("CONTAINERNAME")

        // Obtem os arquivos enviados pelo cliente
        err = c.Request.ParseMultipartForm(50 << 20) //Tamanho maximo suportador pelo gin (envio de formulario)
        if err != nil {
            stringErrorParse := fmt.Sprintf("Erro ao obter arquivos: %s", err.Error())

            c.JSON(http.StatusInternalServerError, gin.H{
                "Erro ao obter arquivos": stringErrorParse,
            })
            log.Println("Erro ao obter arquivos", stringErrorParse)
            return
        }

        // Conecta a conta de armazenamento do Azure
        client, err := storage.NewBasicClient(storageAccountName, accountKey)
        if err != nil {
            log.Fatal("Erro ao criar cliente: ", err)
            c.JSON(http.StatusInternalServerError, gin.H{
                "Erro ao criar cliente: ": err,
            })
            return
        }

        // Obtem uma referência para o contêiner de armazenamento
        blobService := client.GetBlobService()
        container := blobService.GetContainerReference(containerName)

        userIDJWT := c.GetInt("userIDJWT")
        var azureData []models.InsertAzure
        err = c.ShouldBindJSON(&azureData)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{
                "Erro ao decodificar body": err.Error(),
            })
            log.Println("Erro ao decodificar body", err)
            return
        }

        preparing, err := DB.Prepare(`INSERT INTO sis_documento (id_empresa, nome_documento, id_usuario_inclusao) VALUES ($1, $2, $3) RETURNING id_documento, uuid_documento, link_documento `)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{
                "Erro ao preparar banco de dados para realizar insert na tabela sis_documento": err,
            })
            log.Println("Erro ao preparar banco de dados para realizar insert na tabela sis_documento", err)
            return
        }

        // Itera sobre cada arquivo enviado pelo cliente
        for _, fileHeaders := range c.Request.MultipartForm.File {

            for _, fileHeader := range fileHeaders {
                BlobName := uuid.New().String()
                // Abre o arquivo para leitura
                src, err := fileHeader.Open()
                if err != nil {
                    stringErrorHeader := fmt.Sprintf("Erro ao abrir arquivo: %s", err.Error())
                    c.JSON(http.StatusInternalServerError, gin.H{
                        "Error": stringErrorHeader,
                    })
                    log.Println("Error", stringErrorHeader)
                    return
                }
                defer src.Close()

                // Carrega o arquivo para o contêiner
                blob := container.GetBlobReference(BlobName)
                err = blob.CreateBlockBlobFromReader(src, &storage.PutBlobOptions{})
                if err != nil {
                    c.JSON(http.StatusInternalServerError, gin.H{
                        "Erro ao realizar upload do blob": err,
                    })
                    log.Fatal("Erro ao realizar upload do blob: ", err)
                    return
                }

                stringStatusOK := fmt.Sprintf("Arquivo %s enviado com sucesso!", BlobName)
                c.JSON(http.StatusOK, stringStatusOK)
            }
        }

        for _, add := range azureData {
            fmt.Println("Eu entrei no loop")

            _, err := preparing.Exec(1, add.NomeDocumento, userIDJWT)
            if err != nil {
                c.JSON(http.StatusInternalServerError, gin.H{
                    "Erro ao executar insert na tabela sis_documento": err,
                })
                log.Println("Erro ao executar insert na tabela sis_documento", err)
                return
            }
            c.JSON(http.StatusOK, gin.H{
                "Success, blob inserdo no banco com sucesso": preparing,
            })
        }
    }
}

也就是说,我需要通过 Postman 发送一个json +文件,我尝试通过 Postman 发送它,按照以下步骤:

但我总是得到错误:

Erro ao decodificar body EOF

我想要的是:发送我的文件+填充我的json来填充我的数据库(这是必要的,因为我将获得文件名,文件类型,文件链接以及其他变量)
编辑:
我试着用这个链接的例子:Golang gin receive json data and image
我做了这个测试代码:

func Test() gin.HandlerFunc {
return func(c *gin.Context) {
    prepare, err := DB.Prepare(`INSERT INTO sis_documento (id_empresa, nome_documento, id_usuario_inclusao) VALUES ($1, $2, $3)`)
    if err != nil {
        log.Println("Erro ao preparar banco de dados para realizar insert", err)
        c.JSON(http.StatusInternalServerError, gin.H{
            "Erro ao preparar banco de dados para realizar insert": err,
        })
        return
    }

    var azureTesting []models.TestAzure
    userIDJWT := c.GetInt("userIDJWT")

    err = c.ShouldBind(&azureTesting, binding.FormMultipart)
    if err != nil {
        log.Println("Erro ao decodificar body da requisição", err)
        c.JSON(http.StatusInternalServerError, gin.H{
            "Erro ao decodificar body da requisição": err,
        })
        return
    }
    fmt.Println(azureTesting)

    for _, add := range azureTesting {
        _, err := prepare.Exec(1, add.NomeDocumento, userIDJWT)
        if err != nil {
            log.Println("Erro ao preparar banco de dados para realizar insert", err)
            c.JSON(http.StatusInternalServerError, gin.H{
                "Erro ao preparar banco de dados para realizar insert": err,
            })
            return
        }
        c.JSON(http.StatusOK, gin.H{
            "Success": add,
        })
    }
}

}
结构:

type TestAzure struct {
NomeDocumento string `json:"nome_documento" form:"nome_documento" binding:"required"`

}
但我的代码总是打印我的结构体的空切片,它没有填充结构体,也没有输入for
我试着提出这样的请求:

vsmadaxz

vsmadaxz1#

试试这个:

var data struct {
    AzureTesting []struct {
        NomeDocumento string `json:"nome_documento" binding:"required"`
    } `form:"azureTesting"`
}
err = c.ShouldBind(&data, binding.FormMultipart)

在postman中,将“内容类型”重置为auto。字段azureTesting的内容类型不是multipart/form-data

相关问题