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

56 lines
1.4 KiB

5 years ago
  1. package s3_backend
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aws/aws-sdk-go/aws"
  6. "github.com/aws/aws-sdk-go/service/s3/s3iface"
  7. "github.com/aws/aws-sdk-go/service/s3/s3manager"
  8. )
  9. func uploadToS3(sess s3iface.S3API, filename string, destBucket string, destKey string) error {
  10. //open the file
  11. f, err := os.Open(filename)
  12. if err != nil {
  13. return fmt.Errorf("failed to open file %q, %v", filename, err)
  14. }
  15. defer f.Close()
  16. info, err := f.Stat()
  17. if err != nil {
  18. return fmt.Errorf("failed to stat file %q, %v", filename, err)
  19. }
  20. fileSize := info.Size()
  21. partSize := int64(64 * 1024 * 1024) // The minimum/default allowed part size is 5MB
  22. for partSize*1000 < fileSize {
  23. partSize *= 4
  24. }
  25. // Create an uploader with the session and custom options
  26. uploader := s3manager.NewUploaderWithClient(sess, func(u *s3manager.Uploader) {
  27. u.PartSize = partSize
  28. u.Concurrency = 15 // default is 15
  29. })
  30. // Upload the file to S3.
  31. result, err := uploader.Upload(&s3manager.UploadInput{
  32. Bucket: aws.String(destBucket),
  33. Key: aws.String(destKey),
  34. Body: f,
  35. ACL: aws.String("private"),
  36. ServerSideEncryption: aws.String("AES256"),
  37. StorageClass: aws.String("STANDARD_IA"),
  38. })
  39. //in case it fails to upload
  40. if err != nil {
  41. return fmt.Errorf("failed to upload file, %v", err)
  42. }
  43. fmt.Printf("file %s uploaded to %s\n", filename, result.Location)
  44. return nil
  45. }