Files
bl/common/contrib/files/local/local.go
昔念 7590943e9d
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
1
2026-02-07 16:23:52 +08:00

98 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package local 提供本地文件上传支持
package local
import (
"blazing/cool"
"blazing/cool/coolfile"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gtime"
)
type Local struct {
}
func (l *Local) Upload(ctx g.Ctx) (string, error) {
var (
err error
request = g.RequestFromCtx(ctx)
file *ghttp.UploadFile
)
// -------------------------- 核心兼容逻辑适配PHP的字段名 --------------------------
// 优先级uploadfilesPHP转转适配器字段 > files通用多文件字段 > file原字段
// 1. 先尝试获取PHP fof/upload插件的 uploadfiles 字段(单文件)
file = request.GetUploadFile("uploadfiles")
if file == nil {
// 2. 再尝试获取 files 字段多文件取第一个兼容PHP多文件上传
files := request.GetUploadFiles("files")
if len(files) > 0 {
file = files[0] // 取第一个文件和PHP Arr::get($data, 'data.0.url')逻辑一致
}
}
// 3. 最后兼容原 file 字段
if file == nil {
file = request.GetUploadFile("file")
}
// 所有字段都无文件,返回错误
if file == nil {
return "", gerror.New("上传文件为空未找到file/files/uploadfiles字段")
}
// -------------------------- 原有存储逻辑不变 --------------------------
// 以当前年月日为目录
dir := gtime.Now().Format("Ymd")
// 保存路径:./public/uploads/年月日
saveDir := "./public/uploads/" + dir
// 保存文件(自动重命名避免重复)
fileName, err := file.Save(saveDir, true)
if err != nil {
return "", gerror.Wrap(err, "保存上传文件失败")
}
// -------------------------- 拼接访问URL原有逻辑不变 --------------------------
accessURL := "http://" + cool.Config.File.Domain + cool.Config.Address + "/uploads/" + dir + "/" + fileName
return accessURL, nil
}
func (l *Local) GetMode() (data interface{}, err error) {
data = g.MapStrStr{
"mode": cool.Config.File.Mode,
"type": "local",
}
return
}
func (l *Local) New() coolfile.Driver {
return &Local{}
}
func New() coolfile.Driver {
return &Local{}
}
func init() {
var (
err error
driverObj = New()
driverNames = g.SliceStr{"local"}
)
for _, driverName := range driverNames {
if err = coolfile.Register(driverName, driverObj); err != nil {
panic(err)
}
}
s := g.Server()
if !gfile.Exists("./public/uploads") {
err := gfile.Mkdir("./public/uploads")
if err != nil {
panic(err)
}
}
s.AddStaticPath("/public", "./public")
}