package impl
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"os"
"path"
"path/filepath"
"strings"
"time"
"github.com/963yms/videoManage/videoHttpService/orm"
"github.com/963yms/videoManage/videoHttpService/utils"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
uuid "github.com/satori/go.uuid"
"go.mongodb.org/mongo-driver/mongo/options"
"gopkg.in/mgo.v2/bson"
)
var tmpFile string
func init() {
tmpFile = "/home/swjtu/NAS/tmpFile/"
storeFile := "/home/swjtu/NAS/storeFile/"
if _, err := os.Stat(tmpFile); os.IsNotExist(err) {
os.MkdirAll(tmpFile, os.ModePerm)
}
if _, err := os.Stat(storeFile); os.IsNotExist(err) {
os.MkdirAll(storeFile, os.ModePerm)
}
utils.Router.POST("/uploadVideo", uploadVideo)
utils.Router.GET("/searchVideo", searchVideo)
utils.Router.GET("/downloadVideo", downloadVideo)
}
func uploadVideo(c *gin.Context) {
reader, err := c.Request.MultipartReader()
if err != nil {
c.JSON(400, gin.H{"msg": "videoReader_failure"})
return
}
//video
part, _ := reader.NextPart()
file := part.FileName()
filetype := path.Ext(file)
filename := strings.TrimSuffix(file, filetype)
if (filetype != ".flv") && (filetype != ".mp4") && (filetype != ".avi") {
c.JSON(400, gin.H{"msg": "non-standard video format"})
return
} else {
folderName := time.Now().Format("200601")
folderPath := filepath.Join(tmpFile, folderName)
if _, err := os.Stat(folderPath); os.IsNotExist(err) {
os.Mkdir(folderPath, 0777)
os.Chmod(folderPath, 0777)
}
rawFilePath, err := os.Create(folderPath + "/" + file)
if err != nil {
panic(err)
}
defer rawFilePath.Close()
_, err = io.Copy(rawFilePath, part)
if err != nil {
panic(err)
}
uuid_name := uuid.NewV4().String()
old_rawFilePath := folderPath + "/" + file
new_rawFilePath := folderPath + "/" + filename + "_" + uuid_name + filetype
err = os.Rename(old_rawFilePath, new_rawFilePath)
if err != nil {
panic(err)
}
//videoInfo
video := &orm.VideoInfo{}
part2, _ := reader.NextPart()
if part2.FileName() == "" {
b := &bytes.Buffer{}
io.Copy(b, part2)
_ = json.Unmarshal(b.Bytes(), &video)
}
video.Name = video.Name + "_" + uuid_name
video.RawFilePath = new_rawFilePath
fmt.Println("video:", video)
utils.DataSend(video, "rawVideo")
c.JSON(200, gin.H{"msg": "video upload"})
}
fmt.Println("after_time:", time.Now())
}
func searchVideo(ctx *gin.Context) {
req := orm.SearchVideo{}
rsp := orm.RspVideoInfo{}
if err := ctx.ShouldBindBodyWith(&req, binding.JSON); err != nil {
ctx.JSON(400, gin.H{"errCode": err.Error()})
return
}
// fmt.Println("req:", req)
if req.MsgID == "" {
ctx.JSON(400, gin.H{"errCode": "MsgID is null"})
return
}
if req.PageSize == 0 {
ctx.JSON(400, gin.H{"errCode": "pageSize is 0"})
return
}
if req.PageNum == 0 {
ctx.JSON(400, gin.H{"errCode": "pagenum is 0"})
return
}
if req.FactoryID == "" {
ctx.JSON(400, gin.H{"errCode": "factoryID is null"})
}
opts := options.Find()
opts.SetSkip((req.PageNum - 1) * req.PageSize)
opts.SetLimit(req.PageSize)
_filter := []bson.M{}
if req.FactoryID != "" {
_filter = append(_filter, bson.M{"factoryID": bson.M{"$regex": req.FactoryID}})
}
if req.VideoID != "" {
_filter = append(_filter, bson.M{"videoID": bson.M{"$regex": req.VideoID}})
}
if req.Name != "" {
_filter = append(_filter, bson.M{"name": bson.M{"$regex": req.Name}})
}
if req.RoadType != "" {
_filter = append(_filter, bson.M{"roadType": bson.M{"$regex": req.RoadType}})
}
if req.RoadNumber != "" {
_filter = append(_filter, bson.M{"roadNumber": bson.M{"$regex": req.RoadNumber}})
}
if req.StartTime != 0 {
_filter = append(_filter, bson.M{"createTime": bson.M{"$gte": req.StartTime}})
}
if req.EndTime != 0 {
_filter = append(_filter, bson.M{"createTime": bson.M{"$lte": req.EndTime}})
}
filter := bson.M{}
filter["$and"] = _filter
re, err := utils.MateVideoInfoColl.Find(context.Background(), filter, opts)
if err != nil {
ctx.JSON(500, gin.H{"errCode1": err.Error()})
return
}
rsp.MsgID = req.MsgID
if rsp.Total, err = utils.MateVideoInfoColl.CountDocuments(context.Background(), filter); err != nil {
ctx.JSON(500, gin.H{"errCode2": err.Error()})
return
}
if err = re.All(context.TODO(), &rsp.DataList); err != nil {
ctx.JSON(500, gin.H{"errCode3": err.Error()})
return
}
nowtime := time.Now().UnixMicro()
fmt.Println("time:", nowtime)
ctx.JSON(200, rsp)
}
func downloadVideo(ctx *gin.Context) {
req := orm.DownloadVideo{}
if err := ctx.ShouldBindBodyWith(&req, binding.JSON); err != nil {
ctx.JSON(400, gin.H{"errCode": err.Error()})
return
}
if req.MsgID+req.VideoID == "" {
ctx.JSON(400, gin.H{"errCode": "msgID and videoID is null"})
return
}
filter := bson.M{"videoID": req.VideoID}
re, err := utils.MateVideoInfoColl.Find(context.Background(), filter, options.Find())
if err != nil {
ctx.JSON(500, gin.H{"errCode1": err.Error()})
return
}
var rsp []orm.MateVideoInfo
if err = re.All(context.TODO(), &rsp); err != nil {
ctx.JSON(500, gin.H{"errCode2": err.Error()})
return
}
if len(rsp) == 0 {
ctx.JSON(404, gin.H{"msg": "videoID is not avaliable"})
return
}
for _, v := range rsp {
if _, err := os.Stat(v.FilePath); os.IsNotExist(err) {
ctx.JSON(404, gin.H{"err": "file is not exist"})
return
} else {
ctx.File(v.FilePath)
fmt.Println("time1:", time.Now().UnixMicro())
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
videoManage.zip(视频服务的上传、查询、下载)
共23个文件
go:17个
mod:3个
sum:3个
需积分: 9 0 下载量 138 浏览量
2022-11-10
15:42:03
上传
评论
收藏 31KB ZIP 举报
温馨提示
视频服务处理,包括视频上传、查询、下载,采用go-gin框架,运用到kafka、NAS等技术,详细架构图参考https://download.csdn.net/download/unbekannten/86946449,
资源推荐
资源详情
资源评论
收起资源包目录
videoManage.zip (23个子文件)
videoManage
videoService
orm
video.go 4KB
main.go 177B
go.sum 10KB
script
videoSimulator.go 788B
utils
kafka.go 859B
mgodb.go 864B
video.go 800B
impl
video.go 2KB
go.mod 2KB
testVideo
http
video.go 3KB
orm
video.go 4KB
main.go 633B
go.sum 348B
simulator
simulator.go 4KB
go.mod 166B
videoHttpService
orm
video.go 4KB
main.go 251B
go.sum 16KB
utils
kafka.go 688B
mgodb.go 864B
gin.go 119B
impl
video.go 5KB
go.mod 3KB
共 23 条
- 1
资源评论
unbekannten
- 粉丝: 19
- 资源: 78
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功