package admin import ( "errors" "fmt" "path/filepath" "quyun/v2/app/jobs" "quyun/v2/app/services" "quyun/v2/database/models" "quyun/v2/providers/ali" "quyun/v2/providers/app" "quyun/v2/providers/job" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/gofiber/fiber/v3" log "github.com/sirupsen/logrus" "gorm.io/gorm" ) const UPLOAD_PATH = "quyun" // @provider type uploads struct { app *app.Config oss *ali.OSSClient job *job.Job } type PreCheckResp struct { Exists bool `json:"exists"` PreSign *oss.PresignResult `json:"pre_sign"` } // PreUploadCheck // // @Summary 预上传检查 // @Tags Admin Uploads // @Produce json // @Param md5 path string true "文件 MD5" // @Param ext path string true "文件扩展名(不含点)" // @Param mime query string true "文件 MIME 类型" // @Success 200 {object} PreCheckResp "成功" // @Router /admin/uploads/pre-uploaded-check/:md5.:ext [get] // @Bind md5 path // @Bind ext path // @Bind mime query func (up *uploads) PreUploadCheck(ctx fiber.Ctx, md5, ext, mime string) (*PreCheckResp, error) { _, err := services.Media.GetByHash(ctx, md5) if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { preSign, err := up.oss.PreSignUpload(ctx, fmt.Sprintf("%s.%s", md5, ext), mime) if err != nil { return nil, err } return &PreCheckResp{Exists: false, PreSign: preSign}, nil } return &PreCheckResp{Exists: true}, nil } type PostUploadedForm struct { OriginalName string `json:"originalName"` Md5 string `json:"md5"` MimeType string `json:"mimeType"` Size int64 `json:"size"` } // PostUploadedAction // // @Summary 上传完成回调处理 // @Tags Admin Uploads // @Accept json // @Produce json // @Param body body PostUploadedForm true "请求体" // @Success 200 {object} any "成功" // @Router /admin/uploads/post-uploaded-action [post] // @Bind body body func (up *uploads) PostUploadedAction(ctx fiber.Ctx, body *PostUploadedForm) error { m, err := services.Media.GetByHash(ctx, body.Md5) if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } m = &models.Media{ Name: body.OriginalName, MimeType: body.MimeType, Size: body.Size, Hash: body.Md5, Path: filepath.Join(UPLOAD_PATH, body.Md5+filepath.Ext(body.OriginalName)), } if err := m.Create(ctx); err != nil { return err } if m.MimeType == "video/mp4" { if err := up.job.Add(&jobs.DownloadFromAliOSS{MediaHash: m.Hash}); err != nil { log.WithError(err).WithField("media", m).Errorf("add job failed") } } return nil }