webdavuploader.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package imguploader
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io/ioutil"
  6. "net"
  7. "net/http"
  8. "net/url"
  9. "path"
  10. "time"
  11. "github.com/grafana/grafana/pkg/util"
  12. )
  13. type WebdavUploader struct {
  14. url string
  15. username string
  16. password string
  17. public_url string
  18. }
  19. var netTransport = &http.Transport{
  20. Dial: (&net.Dialer{
  21. Timeout: 60 * time.Second,
  22. }).Dial,
  23. TLSHandshakeTimeout: 5 * time.Second,
  24. }
  25. var netClient = &http.Client{
  26. Timeout: time.Second * 60,
  27. Transport: netTransport,
  28. }
  29. func (u *WebdavUploader) Upload(pa string) (string, error) {
  30. url, _ := url.Parse(u.url)
  31. filename := util.GetRandomString(20) + ".png"
  32. url.Path = path.Join(url.Path, filename)
  33. imgData, err := ioutil.ReadFile(pa)
  34. req, err := http.NewRequest("PUT", url.String(), bytes.NewReader(imgData))
  35. if u.username != "" {
  36. req.SetBasicAuth(u.username, u.password)
  37. }
  38. res, err := netClient.Do(req)
  39. if err != nil {
  40. return "", err
  41. }
  42. if res.StatusCode != http.StatusCreated {
  43. body, _ := ioutil.ReadAll(res.Body)
  44. return "", fmt.Errorf("Failed to upload image. Returned statuscode %v body %s", res.StatusCode, body)
  45. }
  46. if u.public_url != "" {
  47. publicURL, _ := url.Parse(u.public_url)
  48. publicURL.Path = path.Join(publicURL.Path, filename)
  49. return publicURL.String(), nil
  50. }
  51. return url.String(), nil
  52. }
  53. func NewWebdavImageUploader(url, username, password, public_url string) (*WebdavUploader, error) {
  54. return &WebdavUploader{
  55. url: url,
  56. username: username,
  57. password: password,
  58. public_url: public_url,
  59. }, nil
  60. }