Я пытаюсь загрузить каталог в корзину Amazon S3.Однако единственный способ загрузить каталог - это перебрать все файлы внутри каталога и загрузить их один за другим.
Я использую Go для перебора файлов в каталоге.Однако для каждого файла, который я перебираю, я хочу выделить процедуру, которая загружает файл, в то время как основной поток перебирает следующий элемент в каталоге и раскручивает другую процедуру, чтобы загрузить его.
Есть идеи, как можно параллельно загружать все файлы в каталог, используя Goroutines и Channels?
Пересмотренный фрагмент кода, в котором реализована программа и канал для параллельной загрузки файлов.Но я не уверен, что это правильная реализация.
func uploadDirToS3(dir string, svc *s3.S3) {
fileList := []string{}
filepath.Walk(dir, func(path string, f os.FileInfo, err error) error {
fmt.Println("PATH ==> " + path)
fileList = append(fileList, path)
return nil
})
for _, pathOfFile := range fileList[1:] {
channel := make(chan bool)
go uploadFiletoS3(pathOfFile, svc, channel)
<-channel
}
}
func uploadFiletoS3(path string, svc *s3.S3, channel chan bool) {
file, err := os.Open(path)
if err != nil {
fmt.Println(err)
}
defer file.Close()
fileInfo, _ := file.Stat()
size := fileInfo.Size()
buffer := make([]byte, size)
file.Read(buffer)
fileBytes := bytes.NewReader(buffer)
fileType := http.DetectContentType(buffer)
s3Path := file.Name()
params := &s3.PutObjectInput{
Bucket: aws.String("name-of-bucket"),
Key: aws.String(s3Path),
Body: fileBytes,
ContentLength: aws.Int64(size),
ContentType: aws.String(fileType),
}
resp, err := svc.PutObject(params)
if err != nil {
fmt.Println(err)
}
fmt.Printf("response %s", awsutil.StringValue(resp))
close(channel)
}
Любые идеи о том, как я мог бы реализовать это лучше?Я заглянул в WaitGroups, но по какой-то причине я обнаружил, что каналы намного проще для понимания и реализации в этой ситуации.