《从0到1搭建一个IM项目》文件模块开发之文件上传

[toc]

概况

前面介绍了用户模块和关系模块、下面来简单介绍一下文件上传模块,这个模块主要是处理用户头像、群头像、消息图片、语音。

目前为止下面目录结构:

HiChat   
    ├── common    //放置公共文件
    |      |——md5.go
    |      |——resp.go
    │  
    ├── config    //做配置文件
    │  
    ├── dao//数据库crud|——user.go
    |     |——relation.go
    |     |——community.go
    |
    ├── global    //放置各种连接池,配置等|——global.go
    |
    ├── initialize  //项目初始化文件|——db.go
    |              |——logger.go
    |
    ├── middlewear  //放置web中间件
    |              |——jwt.go
    ├── models      //数据库表设计|——user_basic.go
    |           |——relation.go
    |           |——community.go
    |
    ├── router           //路由
    |       |——router.go
    │   
    ├── service     //对外api
    |       |——user.go
    |       |——relation.go
    │   
    ├── test        //测试文件
    │  
    ├── main.go     //项目入口
    ├── go.mod            //项目依赖管理
    ├── go.sum

文件上传api

对于文件上传,这里提供两种思路来实现,1.上传到项目服务器;2.使用云厂商(腾讯云或者阿里云)对象存储来存储文件;当然这两种方法都是用户通过上传头像或者发送文件等然后通过调用api,将文件上传至项目服务器或者对象存储,最后只需要返回其文件URL即可。项目中就只实现第一种就可以了,但是使用对象存储会更好,使用有想要使用对象存储的同学可参考阿里云对象存储文档阿里云对象存储Go-SDK进行参考。

下面来实现将文件上传至我们的项目服务器:可上传图片和语音

在service目录下新建attach_upload.go文件,并且在下面项目总目录下新建asset目录,然后在该目录下新建upload目录,用来存储文件。

package service

import (
    "fmt"
    "io"
    "math/rand"
    "net/http"
    "os"
    "strings"
    "time"

  "HiChat/common"

    "github.com/gin-gonic/gin"
)

//Image 图片语音上传并返回url
func Image(ctx *gin.Context) {
    w := ctx.Writer
    req := ctx.Request
    //获取文件
    srcFile, head, err := req.FormFile("file")
    if err != nil {
        common.RespFail(w, err.Error())
        return
    }

    //检查文件后缀
    suffix := ".png"
    ofilName := head.Filename
    tem := strings.Split(ofilName, ".")
    if len(tem) > 1 {
        suffix = "." + tem[len(tem)-1]
    }

    //保存文件
    fileName := fmt.Sprintf("%d%04d%s", time.Now().Unix(), rand.Int31(), suffix)
    dstFile, err := os.Create("./asset/upload/" + fileName)
    if err != nil {
        common.RespFail(w, err.Error())
        return
    }
    _, err = io.Copy(dstFile, srcFile)
    if err != nil {
        common.RespFail(w, err.Error())
    }
    url := "./asset/upload/" + fileName
    common.RespOK(w, url, "发送成功")
}

最后在router目录下router.go中配置路由

//图片、语音模块
    upload := v1.Group("upload").Use(middlewear.JWY())
    {
        upload.POST("/image", service.Image)
    }

测试

%E6%88%AA%E5%B1%8F2023-01-08%20%E4%B8%8B%E5%8D%886.04.00.png

最后可以直接访问url:127.0.0.1:8000/asset/upload/1673172... 就可以看到我们上传的文件。

总结

本篇内容比较简单,就是使用go上传文件,将其保存到服务器,当然这里简单介绍了对象存储,对于文件等资源我们更多的是使用对象存储来,管理文件;有兴趣的同学可以试一试对象存储。

本作品采用《CC 协议》,转载必须注明作者和本文链接
刻意学习
讨论数量: 2
pangxianfei

语音怎么实现发送?

11个月前 评论
ice_moss (楼主) 11个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
118
粉丝
89
喜欢
173
收藏
246
排名:365
访问:2.6 万
私信
所有博文
社区赞助商