feat: udpate upload content type

This commit is contained in:
yanghao05
2025-04-18 14:45:06 +08:00
parent 2854afec53
commit ac65302601
18 changed files with 228 additions and 23 deletions

View File

@@ -3,12 +3,15 @@ package admin
import (
"quyun/app/models"
"quyun/app/requests"
"quyun/providers/ali"
"github.com/gofiber/fiber/v3"
)
// @provider
type medias struct{}
type medias struct {
oss *ali.OSSClient
}
// List medias
// @Router /v1/admin/medias [get]
@@ -18,3 +21,20 @@ func (ctl *medias) List(ctx fiber.Ctx, pagination *requests.Pagination, query *L
cond := models.Medias.BuildConditionWithKey(query.Keyword)
return models.Medias.List(ctx.Context(), pagination, cond)
}
// Show media
// @Router /v1/admin/medias/:id [get]
// @Bind id path
func (ctl *medias) Show(ctx fiber.Ctx, id int64) error {
media, err := models.Medias.GetByID(ctx.Context(), id)
if err != nil {
return ctx.SendString("Media not found")
}
url, err := ctl.oss.GetSignedUrl(ctx.Context(), media.Path)
if err != nil {
return err
}
return ctx.Redirect().To(url)
}

View File

@@ -28,6 +28,7 @@ func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *Li
type PostForm struct {
Title string `json:"title"`
HeadImage int64 `json:"head_image"`
Price int64 `json:"price"`
Discount int16 `json:"discount"`
Introduction string `json:"introduction"`

View File

@@ -23,8 +23,12 @@ func Provide(opts ...opt.Option) error {
}); err != nil {
return err
}
if err := container.Container.Provide(func() (*medias, error) {
obj := &medias{}
if err := container.Container.Provide(func(
oss *ali.OSSClient,
) (*medias, error) {
obj := &medias{
oss: oss,
}
return obj, nil
}); err != nil {

View File

@@ -45,6 +45,11 @@ func (r *Routes) Register(router fiber.Router) {
Query[ListQuery]("query"),
))
router.Get("/v1/admin/medias/:id", Func1(
r.medias.Show,
PathParam[int64]("id"),
))
// 注册路由组: orders
router.Get("/v1/admin/orders", DataFunc2(
r.orders.List,
@@ -81,10 +86,11 @@ func (r *Routes) Register(router fiber.Router) {
))
// 注册路由组: uploads
router.Get("/v1/admin/uploads/pre-uploaded-check/:md5.:ext", DataFunc2(
router.Get("/v1/admin/uploads/pre-uploaded-check/:md5.:ext", DataFunc3(
r.uploads.PreUploadCheck,
PathParam[string]("md5"),
PathParam[string]("ext"),
QueryParam[string]("mime"),
))
router.Post("/v1/admin/uploads/post-uploaded-action", Func1(

View File

@@ -32,10 +32,11 @@ type PreCheckResp struct {
// @Router /v1/admin/uploads/pre-uploaded-check/:md5.:ext [get]
// @Bind md5 path
// @Bind ext path
func (up *uploads) PreUploadCheck(ctx fiber.Ctx, md5, ext string) (*PreCheckResp, error) {
// @Bind mime query
func (up *uploads) PreUploadCheck(ctx fiber.Ctx, md5, ext, mime string) (*PreCheckResp, error) {
_, err := models.Medias.GetByHash(ctx.Context(), md5)
if err != nil && errors.Is(err, qrm.ErrNoRows) {
preSign, err := up.oss.PreSignUpload(ctx.Context(), fmt.Sprintf("%s.%s", md5, ext))
preSign, err := up.oss.PreSignUpload(ctx.Context(), fmt.Sprintf("%s.%s", md5, ext), mime)
if err != nil {
return nil, err
}

View File

@@ -68,9 +68,10 @@ func (r *Routes) Register(router fiber.Router) {
Query[ListQuery]("query"),
))
router.Get("/api/posts/buy/:id", Func1(
router.Get("/api/posts/buy/:id", DataFunc2(
r.posts.Buy,
PathParam[int64]("id"),
Local[*model.Users]("user"),
))
}

View File

@@ -2,6 +2,7 @@ package jobs
import (
"quyun/providers/ali"
"quyun/providers/app"
"quyun/providers/job"
"github.com/riverqueue/river"
@@ -40,9 +41,49 @@ func Provide(opts ...opt.Option) error {
}
if err := container.Container.Provide(func(
__job *job.Job,
app *app.Config,
job *job.Job,
oss *ali.OSSClient,
) (contracts.Initial, error) {
obj := &DownloadFromAliOSSWorker{
app: app,
job: job,
oss: oss,
}
if err := river.AddWorkerSafely(__job.Workers, obj); err != nil {
return nil, err
}
return obj, nil
}, atom.GroupInitial); err != nil {
return err
}
if err := container.Container.Provide(func(
__job *job.Job,
job *job.Job,
oss *ali.OSSClient,
) (contracts.Initial, error) {
obj := &ExtractAudioFromVideoWorker{
job: job,
oss: oss,
}
if err := river.AddWorkerSafely(__job.Workers, obj); err != nil {
return nil, err
}
return obj, nil
}, atom.GroupInitial); err != nil {
return err
}
if err := container.Container.Provide(func(
__job *job.Job,
app *app.Config,
job *job.Job,
oss *ali.OSSClient,
) (contracts.Initial, error) {
obj := &ExtractHeadImageFromVideoWorker{
app: app,
job: job,
oss: oss,
}
if err := river.AddWorkerSafely(__job.Workers, obj); err != nil {

View File

@@ -241,8 +241,8 @@ func (m *mediasModel) GetByID(ctx context.Context, id int64) (*model.Medias, err
m.log.Infof("sql: %s", stmt.DebugSql())
var media model.Medias
err := stmt.QueryContext(ctx, db, &media)
if err != nil {
if err := stmt.QueryContext(ctx, db, &media); err != nil {
m.log.Errorf("error querying media item by ID: %v", err)
return nil, err
}

View File

@@ -28,7 +28,7 @@ DB = 0
AccessKeyId = "LTAI5t86SjiP9zRd3q2w7jQN"
AccessKeySecret = "hV7spvJuWh8w0EEIXj8NFi2uBlF4aS"
Bucket ="rogee-test"
#Host ="abc"
Host ="https://assets.jdwan.com"
Region ="cn-beijing"
CallbackURL = "https://www.baidu.com"

View File

@@ -7,6 +7,7 @@ CREATE TABLE posts(
deleted_at timestamp,
status int2 NOT NULL DEFAULT 0,
title varchar(128) NOT NULL,
head_image int8 NOT NULL DEFAULT 0,
description varchar(256) NOT NULL,
content text NOT NULL,
price int8 NOT NULL DEFAULT 0,

View File

@@ -41,7 +41,7 @@ func Provide(opts ...opt.Option) error {
WithRegion(config.Region)
return &OSSClient{
client: oss.NewClient(cfg),
client: oss.NewClient(cfg.WithUseCName(true).WithEndpoint(*config.Host)),
internalClient: oss.NewClient(cfg.WithUseInternalEndpoint(true)),
config: &config,
}, nil

View File

@@ -3,6 +3,7 @@ package ali
import (
"context"
"strings"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
)
@@ -17,11 +18,11 @@ func (c *OSSClient) GetClient() *oss.Client {
return c.client
}
func (c *OSSClient) PreSignUpload(ctx context.Context, path string) (*oss.PresignResult, error) {
func (c *OSSClient) PreSignUpload(ctx context.Context, path, mimeType string) (*oss.PresignResult, error) {
request := &oss.PutObjectRequest{
Bucket: oss.Ptr(c.config.Bucket),
Key: oss.Ptr("quyun/" + strings.Trim(path, "/")),
ContentType: oss.Ptr("multipart/form-data"),
ContentType: oss.Ptr(mimeType),
}
return c.client.Presign(ctx, request)
}
@@ -38,3 +39,17 @@ func (c *OSSClient) Download(ctx context.Context, path, dest string) error {
}
return nil
}
// GetSignedUrl
func (c *OSSClient) GetSignedUrl(ctx context.Context, path string) (string, error) {
request := &oss.GetObjectRequest{
Bucket: oss.Ptr(c.config.Bucket),
Key: oss.Ptr(path),
}
preSign, err := c.client.Presign(ctx, request, oss.PresignExpires(time.Minute*5))
if err != nil {
return "", err
}
return preSign.URL, nil
}

View File

@@ -65,4 +65,9 @@ Content-Type: application/json
### precheck
GET {{host}}/v1/admin/uploads/pre-uploaded-check/abc.mp4 HTTP/1.1
Content-Type: application/json
authorization: {{token}}
authorization: {{token}}
### get media url
GET {{host}}/v1/admin/medias/6 HTTP/1.1
Authorization: {{token}}