You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

local.go 1.1 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package storage
  2. import (
  3. "io"
  4. "os"
  5. "path/filepath"
  6. )
  7. var (
  8. _ ObjectStorage = &LocalStorage{}
  9. )
  10. // LocalStorage represents a local files storage
  11. type LocalStorage struct {
  12. dir string
  13. }
  14. // NewLocalStorage returns a local files
  15. func NewLocalStorage(bucket string) (*LocalStorage, error) {
  16. if err := os.MkdirAll(bucket, os.ModePerm); err != nil {
  17. return nil, err
  18. }
  19. return &LocalStorage{
  20. dir: bucket,
  21. }, nil
  22. }
  23. // Open open a file
  24. func (l *LocalStorage) Open(path string) (io.ReadCloser, error) {
  25. f, err := os.Open(filepath.Join(l.dir, path))
  26. if err != nil {
  27. return nil, err
  28. }
  29. return f, nil
  30. }
  31. // Save save a file
  32. func (l *LocalStorage) Save(path string, r io.Reader) (int64, error) {
  33. p := filepath.Join(l.dir, path)
  34. if err := os.MkdirAll(filepath.Dir(p), os.ModePerm); err != nil {
  35. return 0, err
  36. }
  37. // always override
  38. if err := os.RemoveAll(p); err != nil {
  39. return 0, err
  40. }
  41. f, err := os.Create(p)
  42. if err != nil {
  43. return 0, err
  44. }
  45. defer f.Close()
  46. return io.Copy(f, r)
  47. }
  48. // Delete delete a file
  49. func (l *LocalStorage) Delete(path string) error {
  50. p := filepath.Join(l.dir, path)
  51. return os.Remove(p)
  52. }