我有一个用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
我试着提出这样的请求:
1条答案
按热度按时间vsmadaxz1#
试试这个:
在postman中,将“内容类型”重置为
auto
。字段azureTesting
的内容类型不是multipart/form-data
。