feat(api): add client app service endpoints
This commit is contained in:
@@ -3,6 +3,7 @@ package upload
|
||||
|
||||
import (
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -11,14 +12,17 @@ import (
|
||||
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/infra"
|
||||
sdkmiddleware "git.apinb.com/bsm-sdk/core/middleware"
|
||||
"git.apinb.com/heqiapp/platforms/backend/api/internal/config"
|
||||
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
const maxUploadSize int64 = 10 << 20
|
||||
|
||||
var allowedExtensions = map[string]struct{}{
|
||||
".jpg": {}, ".jpeg": {}, ".png": {}, ".webp": {}, ".pdf": {},
|
||||
var allowedExtensions = map[string]bool{
|
||||
".jpg": false, ".jpeg": false, ".png": false, ".webp": false, ".pdf": false,
|
||||
".mp4": true, ".mov": true,
|
||||
}
|
||||
|
||||
// UploadFileReply 是文件上传完成后返回的受控资源标识。
|
||||
@@ -31,15 +35,17 @@ type UploadFileReply struct {
|
||||
|
||||
// UploadFile 将允许类型的文件保存至本地 Mock 存储,不直接暴露绝对磁盘路径。
|
||||
func UploadFile(ctx *gin.Context) {
|
||||
ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, maxUploadSize)
|
||||
ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, config.Spec.Global.UploadVideoMaxSize)
|
||||
fileHeader, err := ctx.FormFile("file")
|
||||
if err != nil || fileHeader == nil || fileHeader.Size <= 0 || fileHeader.Size > maxUploadSize {
|
||||
if err != nil || fileHeader == nil || fileHeader.Size <= 0 {
|
||||
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
|
||||
return
|
||||
}
|
||||
|
||||
extension := strings.ToLower(filepath.Ext(fileHeader.Filename))
|
||||
if _, allowed := allowedExtensions[extension]; !allowed {
|
||||
isVideo, allowed := allowedExtensions[extension]
|
||||
if !allowed || (!isVideo && fileHeader.Size > maxUploadSize) ||
|
||||
(isVideo && fileHeader.Size > config.Spec.Global.UploadVideoMaxSize) {
|
||||
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
|
||||
return
|
||||
}
|
||||
@@ -76,6 +82,9 @@ func UploadFile(ctx *gin.Context) {
|
||||
ContentType: fileHeader.Header.Get("Content-Type"),
|
||||
Size: fileHeader.Size,
|
||||
})
|
||||
if claims, err := sdkmiddleware.ParseAuth(ctx); err == nil {
|
||||
log.Printf("upload client=%s account=%s type=%s size=%d uri=%s", claims.Client, claims.Identity, fileHeader.Header.Get("Content-Type"), fileHeader.Size, "/uploads/"+datePath+"/"+filename)
|
||||
}
|
||||
}
|
||||
|
||||
// uploadRoot 返回本地 Mock 存储根目录;生产环境可通过环境变量映射到受控挂载目录。
|
||||
|
||||
Reference in New Issue
Block a user