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  }