github.com/aavshr/aws-sdk-go@v1.41.3/example/service/s3/putObjectWithProcess/putObjWithProcess.go (about) 1 //go:build example 2 // +build example 3 4 package main 5 6 import ( 7 "fmt" 8 "log" 9 "os" 10 "sync" 11 12 "github.com/aavshr/aws-sdk-go/aws" 13 "github.com/aavshr/aws-sdk-go/aws/session" 14 "github.com/aavshr/aws-sdk-go/service/s3/s3manager" 15 ) 16 17 type CustomReader struct { 18 fp *os.File 19 size int64 20 read int64 21 signMap map[int64]struct{} 22 mux sync.Mutex 23 } 24 25 func (r *CustomReader) Read(p []byte) (int, error) { 26 return r.fp.Read(p) 27 } 28 29 func (r *CustomReader) ReadAt(p []byte, off int64) (int, error) { 30 n, err := r.fp.ReadAt(p, off) 31 if err != nil { 32 return n, err 33 } 34 35 r.mux.Lock() 36 // Ignore the first signature call 37 if _, ok := r.signMap[off]; ok { 38 // Got the length have read( or means has uploaded), and you can construct your message 39 r.read += int64(n) 40 fmt.Printf("\rtotal read:%d progress:%d%%", r.read, int(float32(r.read*100)/float32(r.size))) 41 } else { 42 r.signMap[off] = struct{}{} 43 } 44 r.mux.Unlock() 45 return n, err 46 } 47 48 func (r *CustomReader) Seek(offset int64, whence int) (int64, error) { 49 return r.fp.Seek(offset, whence) 50 } 51 52 func main() { 53 if len(os.Args) < 4 { 54 log.Println("USAGE ERROR: AWS_REGION=us-west-2 go run -tags example putObjWithProcess.go <bucket> <key for object> <local file name>") 55 return 56 } 57 58 bucket := os.Args[1] 59 key := os.Args[2] 60 filename := os.Args[3] 61 62 sess, err := session.NewSession() 63 if err != nil { 64 log.Fatalf("failed to load session, %v", err) 65 } 66 67 file, err := os.Open(filename) 68 if err != nil { 69 log.Fatalf("failed to open file %v, %v", filename, err) 70 } 71 72 fileInfo, err := file.Stat() 73 if err != nil { 74 log.Fatalf("failed to stat file %v, %v", filename, err) 75 return 76 } 77 78 reader := &CustomReader{ 79 fp: file, 80 size: fileInfo.Size(), 81 signMap: map[int64]struct{}{}, 82 } 83 84 uploader := s3manager.NewUploader(sess, func(u *s3manager.Uploader) { 85 u.PartSize = 5 * 1024 * 1024 86 u.LeavePartsOnError = true 87 }) 88 89 output, err := uploader.Upload(&s3manager.UploadInput{ 90 Bucket: aws.String(bucket), 91 Key: aws.String(key), 92 Body: reader, 93 }) 94 if err != nil { 95 log.Fatalf("failed to put file %v, %v", filename, err) 96 return 97 } 98 99 fmt.Println() 100 log.Println(output.Location) 101 }