98 lines
2.6 KiB
Go
98 lines
2.6 KiB
Go
// 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的字段名 --------------------------
|
||
// 优先级:uploadfiles(PHP转转适配器字段) > 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")
|
||
}
|