s3uploader.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package imguploader
  2. import (
  3. "io/ioutil"
  4. "net/http"
  5. "net/url"
  6. "path"
  7. "github.com/grafana/grafana/pkg/log"
  8. "github.com/grafana/grafana/pkg/util"
  9. "github.com/kr/s3/s3util"
  10. )
  11. type S3Uploader struct {
  12. bucket string
  13. secretKey string
  14. accessKey string
  15. log log.Logger
  16. }
  17. func NewS3Uploader(bucket, accessKey, secretKey string) *S3Uploader {
  18. return &S3Uploader{
  19. bucket: bucket,
  20. accessKey: accessKey,
  21. secretKey: secretKey,
  22. log: log.New("s3uploader"),
  23. }
  24. }
  25. func (u *S3Uploader) Upload(imageDiskPath string) (string, error) {
  26. s3util.DefaultConfig.AccessKey = u.accessKey
  27. s3util.DefaultConfig.SecretKey = u.secretKey
  28. header := make(http.Header)
  29. header.Add("x-amz-acl", "public-read")
  30. header.Add("Content-Type", "image/png")
  31. var imageUrl *url.URL
  32. var err error
  33. if imageUrl, err = url.Parse(u.bucket); err != nil {
  34. return "", err
  35. }
  36. // add image to url
  37. imageUrl.Path = path.Join(imageUrl.Path, util.GetRandomString(20)+".png")
  38. imageUrlString := imageUrl.String()
  39. log.Debug("Uploading image to s3", "url", imageUrlString)
  40. writer, err := s3util.Create(imageUrlString, header, nil)
  41. if err != nil {
  42. return "", err
  43. }
  44. defer writer.Close()
  45. imgData, err := ioutil.ReadFile(imageDiskPath)
  46. if err != nil {
  47. return "", err
  48. }
  49. _, err = writer.Write(imgData)
  50. if err != nil {
  51. return "", err
  52. }
  53. return imageUrlString, nil
  54. }