package storage import ( "context" "io" "path/filepath" "strings" "github.com/studio-b12/gowebdav" ) type WebDAVStorage struct { client *gowebdav.Client root string } func NewWebDAVStorage(url, username, password, root string) *WebDAVStorage { client := gowebdav.NewClient(url, username, password) return &WebDAVStorage{ client: client, root: root, } } func (s *WebDAVStorage) getFullPath(path string) string { return filepath.ToSlash(filepath.Join(s.root, path)) } func (s *WebDAVStorage) Save(ctx context.Context, path string, reader io.Reader) error { fullPath := s.getFullPath(path) // Ensure directory exists dir := filepath.Dir(fullPath) if dir != "." && dir != "/" { parts := strings.Split(strings.Trim(dir, "/"), "/") current := "" for _, part := range parts { current += "/" + part _ = s.client.Mkdir(current, 0755) } } return s.client.WriteStream(fullPath, reader, 0644) } func (s *WebDAVStorage) Open(ctx context.Context, path string) (io.ReadCloser, error) { fullPath := s.getFullPath(path) return s.client.ReadStream(fullPath) } func (s *WebDAVStorage) Delete(ctx context.Context, path string) error { fullPath := s.getFullPath(path) return s.client.Remove(fullPath) }