Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

101 wiersze
2.3 KiB

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/goamz/goamz/s3"
  5. "io"
  6. "mime"
  7. "os"
  8. "path/filepath"
  9. "strconv"
  10. )
  11. type Storage interface {
  12. Get(token string, filename string) (reader io.ReadCloser, contentType string, contentLength uint64, err error)
  13. Put(token string, filename string, reader io.Reader, contentType string, contentLength uint64) error
  14. }
  15. type LocalStorage struct {
  16. Storage
  17. basedir string
  18. }
  19. func NewLocalStorage(basedir string) (*LocalStorage, error) {
  20. return &LocalStorage{basedir: basedir}, nil
  21. }
  22. func (s *LocalStorage) Get(token string, filename string) (reader io.ReadCloser, contentType string, contentLength uint64, err error) {
  23. path := filepath.Join(s.basedir, token, filename)
  24. // content type , content length
  25. if reader, err = os.Open(path); err != nil {
  26. return
  27. }
  28. var fi os.FileInfo
  29. if fi, err = os.Lstat(path); err != nil {
  30. }
  31. contentLength = uint64(fi.Size())
  32. contentType = mime.TypeByExtension(filepath.Ext(filename))
  33. return
  34. }
  35. func (s *LocalStorage) Put(token string, filename string, reader io.Reader, contentType string, contentLength uint64) error {
  36. var f io.WriteCloser
  37. var err error
  38. path := filepath.Join(s.basedir, token)
  39. if err = os.Mkdir(path, 0700); err != nil && !os.IsExist(err) {
  40. return err
  41. }
  42. if f, err = os.OpenFile(filepath.Join(path, filename), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600); err != nil {
  43. fmt.Printf("%s", err)
  44. return err
  45. }
  46. defer f.Close()
  47. if _, err = io.Copy(f, reader); err != nil {
  48. return err
  49. }
  50. return nil
  51. }
  52. type S3Storage struct {
  53. Storage
  54. bucket *s3.Bucket
  55. }
  56. func NewS3Storage() (*S3Storage, error) {
  57. bucket, err := getBucket()
  58. if err != nil {
  59. return nil, err
  60. }
  61. return &S3Storage{bucket: bucket}, nil
  62. }
  63. func (s *S3Storage) Get(token string, filename string) (reader io.ReadCloser, contentType string, contentLength uint64, err error) {
  64. key := fmt.Sprintf("%s/%s", token, filename)
  65. // content type , content length
  66. response, err := s.bucket.GetResponse(key)
  67. contentType = ""
  68. contentLength, err = strconv.ParseUint(response.Header.Get("Content-Length"), 10, 0)
  69. reader = response.Body
  70. return
  71. }
  72. func (s *S3Storage) Put(token string, filename string, reader io.Reader, contentType string, contentLength uint64) error {
  73. key := fmt.Sprintf("%s/%s", token, filename)
  74. err := s.bucket.PutReader(key, reader, int64(contentLength), contentType, s3.Private, s3.Options{})
  75. return err
  76. }