feat: 添加文件驱动和本地驱动实现,支持文件操作功能

This commit is contained in:
2025-09-20 12:45:01 +08:00
parent 10dadc0af4
commit f8e4a84d53
5 changed files with 190 additions and 0 deletions

View File

@ -0,0 +1,76 @@
package filedriver
import (
"bytes"
"fmt"
"github.com/LiteyukiStudio/spage/pkg/constants"
"github.com/LiteyukiStudio/spage/pkg/resps"
"github.com/cloudwego/hertz/pkg/app"
"io"
"os"
"path"
"github.com/studio-b12/gowebdav"
)
type WebDAVClientDriver struct {
client *gowebdav.Client
config *DriverConfig
BasePath string
}
func NewWebDAVClientDriver(driverConfig *DriverConfig) *WebDAVClientDriver {
c := gowebdav.NewClient(driverConfig.WebDavUrl, driverConfig.WebDavUser, driverConfig.WebDavPassword)
return &WebDAVClientDriver{client: c, BasePath: driverConfig.BasePath, config: driverConfig}
}
func (d *WebDAVClientDriver) fullPath(p string) string {
if d.BasePath == "" {
return p
}
return path.Join(d.BasePath, p)
}
func (d *WebDAVClientDriver) Save(ctx *app.RequestContext, p string, r io.Reader) error {
data, err := io.ReadAll(r)
if err != nil {
return err
}
return d.client.Write(d.fullPath(p), data, 0644)
}
func (d *WebDAVClientDriver) Open(ctx *app.RequestContext, p string) (io.ReadCloser, error) {
data, err := d.client.Read(d.fullPath(p))
if err != nil {
return nil, err
}
return io.NopCloser(bytes.NewReader(data)), nil
}
func (d *WebDAVClientDriver) Get(ctx *app.RequestContext, p string) {
if d.config.WebDavPolicy == constants.WebDavPolicyRedirect {
ctx.Redirect(302, []byte(d.config.WebDavUrl+d.fullPath(p)))
return
} else {
data, err := d.client.Read(d.fullPath(p))
if err != nil {
resps.InternalServerError(ctx, err.Error())
return
}
ctx.SetBodyStream(bytes.NewReader(data), len(data))
ctx.Response.Header.Set("Content-Type", "application/octet-stream")
ctx.Response.Header.Set("Content-Length", fmt.Sprintf("%d", len(data)))
}
}
func (d *WebDAVClientDriver) Delete(ctx *app.RequestContext, p string) error {
return d.client.Remove(d.fullPath(p))
}
func (d *WebDAVClientDriver) Stat(ctx *app.RequestContext, p string) (os.FileInfo, error) {
return d.client.Stat(d.fullPath(p))
}
func (d *WebDAVClientDriver) ListDir(ctx *app.RequestContext, p string) ([]os.FileInfo, error) {
return d.client.ReadDir(d.fullPath(p))
}