脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - golang实现文件上传并转存数据库功能

golang实现文件上传并转存数据库功能

2022-07-26 18:03RazerZhang Golang

这篇文章主要为大家详细介绍了golang实现文件上传并转存数据库功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了golang实现文件上传并转存数据库的具体代码,供大家参考,具体内容如下

需求

上传图片,且可选择将图片保存到数据中。

一、流程图

golang实现文件上传并转存数据库功能

二、步骤

1.上传文件接口

获取文件,并返回base64string流

代码如下(示例):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func setIconPost(c *gin.Context)  {
    //获取文件,icon实现对上传文件的访问,header是对上传文件信息的标记
    icon,header,err :=c.Request.FormFile("file")
    dangerous(err)
    defer icon.Close()
    //path.Ext是取后缀,Tolower小写
    ext := strings.ToLower(path.Ext(header.Filename))
    if header.Size>1024*1024*2{
        fmt.Println("文件过大")
    }
    buf := bytes.NewBuffer(nil)
    //读取icon的数据存入buf中
    if _,err := io.Copy(buf,icon);err != nil{
        return
    }
    //将base64返回前端
    renderData(c, gin.H{
        "base64":base64.StdEncoding.EncodeToString(buf.Bytes()),
        "icon-ext":ext,
    },nil)
}

2.存储数据

代码如下(示例):

?
1
2
3
4
5
6
7
8
9
10
11
func setEntPost(c *gin.Context)  {
    var f Identical
    bind(c,&f)
    models.EtpSave(f.Copyright,"copyright")
    models.EtpSave(f.Introduction,"introduction")
    models.EtpSave(f.Icon,"icon")
    models.EtpSave(f.Logo,"logo")
    models.EtpSave(f.Version,"version")
    models.EtpSave(f.Belong,"belong")
    renderMessage(c,nil)
}

3.存储的数据库操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type Etp struct {
    Id    int         `json:"id"`
    Ckey  string     `json:"ckey"`
    Cval  string    `json:"cval"`
    Kind  int         `json:"kind"`
}
func EtpSave(cval, ckey string) error {
    var obj Etp
    //数据库是否存在
    has,err := DB["rdb"].Table("configs").Where("ckey=?",ckey).Get(&obj)
    if err != nil{
        return err
    }
    //不存在
    if !has {
        _, err = DB["rdb"].Table("configs").Where("ckey=?",ckey).Insert(Etp{
            Ckey: ckey,
            Cval: cval,
            Kind: 1,
        })
    }else{
        obj.Cval = cval
        DB["rdb"].Table("configs").Where("ckey=?",ckey).Cols("cval").Update(&obj)
    }
    return err
}

4.优化

若上传图片稍大,在转存MySQL时会报错。Data too long for column '......' at row 1

解决方法

将数据库字段格式设置为longtext

总结

本需求主要难点在于对于golang核心库方法的掌握,包括上传文件,[]bytes 和 string之间的转换。

整体框架:

一、接收文件/图片接口
二、修改/保存图片的接口
三、保存数据的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/weixin_53970851/article/details/119763499

延伸 · 阅读

精彩推荐
  • Golang使用go xorm来操作mysql的方法实例

    使用go xorm来操作mysql的方法实例

    今天小编就为大家分享一篇关于使用go xorm来操作mysql的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    stpeace6582020-05-24
  • GolangGolang中的参数传递示例详解

    Golang中的参数传递示例详解

    参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,下面这篇文章主要给大家介...

    tomorrowwu4972020-05-08
  • Golanggo语言 全局变量和局部变量实例

    go语言 全局变量和局部变量实例

    这篇文章主要介绍了go语言 全局变量和局部变量实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    徒步远方99911522021-03-23
  • Golanggolang http请求封装代码

    golang http请求封装代码

    这篇文章主要介绍了golang http请求封装代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    一名路过的小码农7282021-02-28
  • Golang深入了解Golang网络编程Net包的使用

    深入了解Golang网络编程Net包的使用

    net包主要是增加 context 控制,封装了一些不同的连接类型以及DNS 查找等等,同时在有需要的地方引入 goroutine 提高处理效率。本文主要和大家分享下在Go中...

    张春9752022-07-20
  • Golang如何使用 Go 中的函数类型 (Function Types)?

    如何使用 Go 中的函数类型 (Function Types)?

    函数类型(function types)是一种很特殊的类型,它表示着所有拥有同样的入参类型和返回值类型的函数集合。...

    Go编程时光5182021-09-15
  • Golang浅谈Go语言的error类型

    浅谈Go语言的error类型

    这篇文章主要介绍了浅谈Go语言的error类型,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    fwhezfwhez7902021-03-09
  • Golang在Colaboratory上运行Go程序的详细过程

    在Colaboratory上运行Go程序的详细过程

    这篇文章主要介绍了在Colaboratory上运行Go程序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    IMJCW7312021-09-17