feat: udpate upload content type
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"),
|
||||
))
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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}}
|
||||
Reference in New Issue
Block a user