Files
2026-10-26 16:28:14 +08:00

129 lines
3.6 KiB
Go

package uploadapi
import (
"net/http"
"videoweb/app/service/uploadser"
"videoweb/pub/common"
"videoweb/pub/common/log"
"videoweb/pub/common/srvdef"
"github.com/gin-gonic/gin"
)
// VideoBody 分片上传视频
// @Tags 上传
// @Summary 视频分片上传
// @Description 将视频分片转发至存储服务 /media/web/autopublish/videoBody
// @Accept multipart/form-data
// @Produce json
// @Param taskId formData string true "视频任务ID"
// @Param pos formData string true "当前分片序号,从0开始"
// @Param uploadUserName formData string false "上传用户名,为空默认 questionnaires"
// @Param file formData file true "分片文件数据"
// @Success 200 {object} uploadser.VideoBodyResp "成功"
// @Failure 400 {string} string "参数错误"
// @Router /api/app/upload/videoBody [post]
func VideoBody(ctx *gin.Context) {
form, err := ctx.MultipartForm()
if err != nil {
common.ServerJSON(ctx, srvdef.ErrParamError, nil)
return
}
taskIds := form.Value["taskId"]
posList := form.Value["pos"]
uploadUserNames := form.Value["uploadUserName"]
fileList := form.File["file"]
if len(taskIds) == 0 || taskIds[0] == "" {
common.ServerJSON(ctx, srvdef.ErrParamError, "taskId 不能为空")
return
}
if len(posList) == 0 || posList[0] == "" {
common.ServerJSON(ctx, srvdef.ErrParamError, "pos 不能为空")
return
}
if len(fileList) == 0 {
common.ServerJSON(ctx, srvdef.ErrParamError, "file 不能为空")
return
}
param := &uploadser.VideoBodyParam{
TaskId: taskIds[0],
Pos: posList[0],
FileHeader: fileList[0],
}
if len(uploadUserNames) > 0 {
param.UploadUserName = uploadUserNames[0]
}
respBytes, err := uploadser.ForwardVideoBody(param)
if err != nil {
log.Error("VideoBody forward failed", log.E(err))
common.ServerJSON(ctx, srvdef.ServerError, nil)
return
}
ctx.Data(http.StatusOK, "application/json; charset=utf-8", respBytes)
}
// VideoOk 通知视频分片上传完成
// @Tags 上传
// @Summary 视频分片上传完成通知
// @Description 所有分片上传完毕后调用,转发至存储服务 /media/web/autopublish/videoOk
// @Accept json
// @Produce json
// @Param param body object true "{ \"taskId\": \"...\" }"
// @Success 200 {object} uploadser.VideoOkResp "成功"
// @Failure 400 {string} string "参数错误"
// @Router /api/app/upload/videoOk [post]
func VideoOk(ctx *gin.Context) {
var req struct {
TaskId string `json:"taskId" binding:"required"`
}
if err := ctx.ShouldBindJSON(&req); err != nil {
common.ServerJSON(ctx, srvdef.ErrParamError, nil)
return
}
respBytes, err := uploadser.ForwardVideoOk(req.TaskId)
if err != nil {
log.Error("VideoOk forward failed", log.E(err))
common.ServerJSON(ctx, srvdef.ServerError, nil)
return
}
ctx.Data(http.StatusOK, "application/json; charset=utf-8", respBytes)
}
// UploadImage 上传图片
// @Tags 上传
// @Summary 图片上传
// @Description 将图片转发至存储服务 /media/web/autopublish/image
// @Accept multipart/form-data
// @Produce json
// @Param file formData file true "图片文件"
// @Success 200 {object} uploadser.ImageUploadResp "成功"
// @Failure 400 {string} string "参数错误"
// @Router /api/app/upload/image [post]
func UploadImage(ctx *gin.Context) {
f, err := ctx.FormFile("file")
if err != nil {
common.ServerJSON(ctx, srvdef.ErrParamError, "file 不能为空")
return
}
param := &uploadser.ImageParam{
FileHeader: f,
}
respBytes, err := uploadser.ForwardImage(param)
if err != nil {
log.Error("UploadImage forward failed", log.E(err))
common.ServerJSON(ctx, srvdef.ServerError, nil)
return
}
ctx.Data(http.StatusOK, "application/json; charset=utf-8", respBytes)
}