imguploader.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package imguploader
  2. import (
  3. "io/ioutil"
  4. "net/http"
  5. "time"
  6. "github.com/grafana/grafana/pkg/log"
  7. "github.com/grafana/grafana/pkg/util"
  8. "github.com/kr/s3/s3util"
  9. )
  10. type Uploader interface {
  11. Upload(imgUrl string) (string, error)
  12. }
  13. type S3Uploader struct {
  14. bucket string
  15. secretKey string
  16. accessKey string
  17. }
  18. func NewS3Uploader(bucket, accessKey, secretKey string) *S3Uploader {
  19. return &S3Uploader{
  20. bucket: bucket,
  21. accessKey: accessKey,
  22. secretKey: secretKey,
  23. }
  24. }
  25. func (u *S3Uploader) Upload(imgUrl string) (string, error) {
  26. client := http.Client{Timeout: time.Duration(60 * time.Second)}
  27. res, err := client.Get(imgUrl)
  28. if err != nil {
  29. return "", err
  30. }
  31. s3util.DefaultConfig.AccessKey = u.accessKey
  32. s3util.DefaultConfig.SecretKey = u.secretKey
  33. log.Info("AccessKey: %s", u.accessKey)
  34. log.Info("SecretKey: %s", u.secretKey)
  35. header := make(http.Header)
  36. header.Add("x-amz-acl", "public-read")
  37. header.Add("Content-Type", "image/png")
  38. fullUrl := u.bucket + util.GetRandomString(20) + ".png"
  39. writer, err := s3util.Create(fullUrl, header, nil)
  40. if err != nil {
  41. return "", err
  42. }
  43. defer writer.Close()
  44. imgData, err := ioutil.ReadAll(res.Body)
  45. if err != nil {
  46. return "", err
  47. }
  48. _, err = writer.Write(imgData)
  49. if err != nil {
  50. return "", err
  51. }
  52. return fullUrl, nil
  53. }