mirror of
https://github.com/simon-ding/polaris.git
synced 2026-05-08 03:27:27 +08:00
feat: change webdav impl
This commit is contained in:
@@ -11,7 +11,7 @@ import (
|
||||
|
||||
type Storage interface {
|
||||
Move(src, dest string) error
|
||||
ReadDir(dir string) ([]FileInfo, error)
|
||||
ReadDir(dir string) ([]fs.FileInfo, error)
|
||||
}
|
||||
|
||||
func NewLocalStorage(dir string) *LocalStorage {
|
||||
|
||||
@@ -1,36 +1,23 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"polaris/log"
|
||||
"time"
|
||||
|
||||
"github.com/emersion/go-webdav"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/studio-b12/gowebdav"
|
||||
)
|
||||
|
||||
type FileInfo struct {
|
||||
Path string
|
||||
Size int64
|
||||
ModTime time.Time
|
||||
IsDir bool
|
||||
MIMEType string
|
||||
ETag string
|
||||
}
|
||||
|
||||
type WebdavStorage struct {
|
||||
fs *webdav.Client
|
||||
fs *gowebdav.Client
|
||||
}
|
||||
|
||||
func NewWebdavStorage(url, user, password string) (*WebdavStorage, error) {
|
||||
c, err := webdav.NewClient(webdav.HTTPClientWithBasicAuth(http.DefaultClient, user, password), url)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "new webdav")
|
||||
c := gowebdav.NewClient(url, user, password)
|
||||
if err := c.Connect(); err != nil {
|
||||
return nil, errors.Wrap(err, "connect webdav")
|
||||
}
|
||||
return &WebdavStorage{
|
||||
fs: c,
|
||||
@@ -44,7 +31,7 @@ func (w *WebdavStorage) Move(local, remote string) error {
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "read file %v", path)
|
||||
}
|
||||
|
||||
|
||||
rel, err := filepath.Rel(local, path)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "path relation")
|
||||
@@ -53,23 +40,18 @@ func (w *WebdavStorage) Move(local, remote string) error {
|
||||
|
||||
if info.IsDir() {
|
||||
|
||||
if err := w.fs.Mkdir(context.TODO(), remoteName); err != nil {
|
||||
if err := w.fs.Mkdir(remoteName, 0666); err != nil {
|
||||
return errors.Wrapf(err, "mkdir %v", remoteName)
|
||||
}
|
||||
|
||||
} else { //is file
|
||||
if writer, err := w.fs.Create(context.TODO(), remoteName); err != nil {
|
||||
return errors.Wrapf(err, "create file %s", remoteName)
|
||||
} else {
|
||||
defer writer.Close()
|
||||
if f, err := os.OpenFile(path, os.O_RDONLY, 0666); err != nil {
|
||||
return errors.Wrapf(err, "read file %v", path)
|
||||
} else { //open success
|
||||
defer f.Close()
|
||||
_, err := io.Copy(writer, f)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "transmitting data error")
|
||||
}
|
||||
if f, err := os.OpenFile(path, os.O_RDONLY, 0666); err != nil {
|
||||
return errors.Wrapf(err, "read file %v", path)
|
||||
} else { //open success
|
||||
defer f.Close()
|
||||
|
||||
if err := w.fs.WriteStream(remoteName, f, 0666); err != nil {
|
||||
return errors.Wrap(err, "transmitting data error")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,21 +64,6 @@ func (w *WebdavStorage) Move(local, remote string) error {
|
||||
return os.RemoveAll(local)
|
||||
}
|
||||
|
||||
func (w *WebdavStorage) ReadDir(dir string) ([]FileInfo, error) {
|
||||
fi, err := w.fs.ReadDir(context.TODO(), dir, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var res []FileInfo = make([]FileInfo, 0, len(fi))
|
||||
for _, f := range fi {
|
||||
res = append(res, FileInfo{
|
||||
Path: f.Path,
|
||||
Size: f.Size,
|
||||
ModTime: f.ModTime,
|
||||
IsDir: f.IsDir,
|
||||
MIMEType: f.MIMEType,
|
||||
ETag: f.ETag,
|
||||
})
|
||||
}
|
||||
return res, nil
|
||||
func (w *WebdavStorage) ReadDir(dir string) ([]fs.FileInfo, error) {
|
||||
return w.fs.ReadDir(dir)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user