「从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)
}
测试
最后可以直接访问url:http://127.0.0.1:8000/asset/upload/16731722322019727887.png 就可以看到我们上传的文件。
总结
本篇内容比较简单,就是使用go上传文件,将其保存到服务器,当然这里简单介绍了对象存储,对于文件等资源我们更多的是使用对象存储来,管理文件;有兴趣的同学可以试一试对象存储。