Merge branch 'feat-hjj-FileExpand' into dev

This commit is contained in:
jiaji.H 2026-03-26 15:54:23 +08:00
commit 771e491bdc
2 changed files with 82 additions and 1 deletions

View File

@ -173,6 +173,7 @@ func NewRouter() *gin.Engine {
resourceRoute.POST("/upload", file.Upload) resourceRoute.POST("/upload", file.Upload)
resourceRoute.POST("/tus/create", file.TusCreate) resourceRoute.POST("/tus/create", file.TusCreate)
resourceRoute.POST("/tus/upload", file.TusUpload) resourceRoute.POST("/tus/upload", file.TusUpload)
resourceRoute.POST("/tus/upload/mp4", file.TusUploadMP4)
v1.Group("/resource").GET("/raw/*path", file.Raw) v1.Group("/resource").GET("/raw/*path", file.Raw)
resourceRoute.GET("/dir/raw", file.DirDownload) resourceRoute.GET("/dir/raw", file.DirDownload)
resourceRoute.GET("/preview/:size/*path", file.Preview) resourceRoute.GET("/preview/:size/*path", file.Preview)

View File

@ -12,6 +12,7 @@ import (
"io" "io"
"net/http" "net/http"
"net/url" "net/url"
"os"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -268,7 +269,7 @@ func TusUpload(ctx *gin.Context) {
} }
if !isLikelyMP4(b) { if !isLikelyMP4(b) {
service.Error(ctx, errors.New("mp4机器码校验失败")) service.Error(ctx, errors.New(".mp4机器码校验错误,该文件可能不是标准的.mp4文件"))
//删除对应空文件 //删除对应空文件
_, err = service.FilesProvider.Delete(ctx, &files.DeleteReq{ _, err = service.FilesProvider.Delete(ctx, &files.DeleteReq{
Path: ctx.DefaultQuery("path", "/"), Path: ctx.DefaultQuery("path", "/"),
@ -296,6 +297,85 @@ func TusUpload(ctx *gin.Context) {
service.Success(ctx, nil) service.Success(ctx, nil)
} }
func TusUploadMP4(ctx *gin.Context) {
//读取传入的本地路径文件
var req files.TusCreateReq
if err := ctx.ShouldBindJSON(&req); err != nil {
service.Error(ctx, err)
return
}
userPath := req.UserSpacePath
req.UserSpacePath = getUserSpacePath(ctx)
fileInfo, err := os.Stat(userPath)
if err != nil {
service.Error(ctx, errors.New(common.GetFileInfoFailed))
return
}
if fileInfo.IsDir() {
service.Error(ctx, errors.New("localPath 不能是目录"))
return
}
totalSize := fileInfo.Size()
if totalSize <= 0 {
service.Error(ctx, errors.New("文件为空"))
return
}
//如果是.mp4文件则判断文件大小
if strings.HasSuffix(strings.ToLower(req.Path), ".mp4") && fileInfo.Size() > 1024*1024 {
//大于1mb的文件进行分块上传
f, err := os.Open(userPath)
if err != nil {
service.Error(ctx, errors.New(common.ERROR_OPEN_FILE))
return
}
defer f.Close()
const chunkSize int64 = 2*1024*1024 - 100
for offset := int64(0); offset < totalSize; {
end := offset + chunkSize
if end > totalSize {
end = totalSize
}
n := end - offset
buf := make([]byte, n)
// 用 ReadAt 读指定偏移的分片
readN, readErr := f.ReadAt(buf, offset)
if readErr != nil && readErr != io.EOF {
service.Error(ctx, errors.New(common.ERROR_OPEN_FILE))
return
}
if int64(readN) != n {
service.Error(ctx, errors.New("读取分片长度不一致"))
return
}
// 4) 首包 MP4 机器码校验offset==0
if offset == 0 {
if !isLikelyMP4(buf) {
service.Error(ctx, errors.New("mp4机器码校验失败,该文件可能不是标准 mp4"))
return
}
}
// 5) TusUpload 写入当前分片
_, err = service.FilesProvider.TusUpload(ctx, &files.TusUploadReq{
Path: req.Path,
UploadOffset: offset,
Content: buf,
UserSpacePath: req.UserSpacePath,
})
if err != nil {
service.Error(ctx, errors.New(common.TusUploadFailed))
return
}
offset = end
}
service.Success(ctx, gin.H{
"destPath": req.Path,
"localPath": userPath,
"uploadLength": totalSize,
})
}
}
func Preview(ctx *gin.Context) { func Preview(ctx *gin.Context) {
var size int var size int
size, err := strconv.Atoi(ctx.Param("size")) size, err := strconv.Atoi(ctx.Param("size"))