我發現了很多與將影像上傳到 S3 相關的問題,但我還沒有找到可以完全幫助我的帖子。所以,我決定問我的問題。
我有從URL上傳影像到S3的情況,所以我所做的只是先從URL下載影像,然后再上傳到S3。
// download image form url
resp, _ := http.Get("https://sample-videos.com/img/Sample-jpg-image-50kb.jpg")
byteImage, _ = ioutil.ReadAll(resp.Body)
// upload to s3 (using s3manager)
_, err = s3ManagerClient.Upload(&s3manager.UploadInput{
Bucket: aws.String(awsS3Bucket),
Key: aws.String(awsS3Destination),
Body: bytes.NewReader(byteImage),
})
但是,我的代碼有問題,上傳程序必須等到下載程序完成。我的目標是在不等待下載程序完成的情況下將影像上傳到 s3,這意味著下載和上傳程序同時發生。
這是我的新代碼(洗掉處理錯誤以提高可讀性)
resp, _ := http.Get("https://sample-videos.com/img/Sample-jpg-image-50kb.jpg")
// init s3
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String(awsRegion),
Credentials: credentials.NewStaticCredentials(awsS3Key, awsS3Secret, ""),
}))
s3ManagerClient := s3manager.NewUploader(sess, func(u *s3manager.Uploader) {
u.PartSize = int64(DefaultS3OptionPartSizeInMB)
u.Concurrency = DefaultS3OptionConcurrency
})
buf := make([]byte, 1024) // per kb
for {
n, _ := resp.Body.Read(buf)
if n == 0 {
break
}
_, err = s3ManagerClient.Upload(&s3manager.UploadInput{
Bucket: aws.String(awsS3Bucket),
Key: aws.String(awsS3Destination),
Body: bytes.NewReader(buf[:n]), // upload image per part
})
}
這段代碼成功上傳圖片到S3,但是檔案壞了,我懷疑是圖片沒有完全上傳(程序有問題)。
uj5u.com熱心網友回復:
您的問題是 for 回圈會將影像以位元組塊的形式上傳到awsS3Destination. 您真正在做的是用單個位元組塊替換影像的內容,一次一個。
您可以嘗試將回應正文傳遞給 s3 上傳器:
resp, err := http.Get("https://sample-videos.com/img/Sample-jpg-image-50kb.jpg")
if err != nil {
// handle error
}
_, err = s3ManagerClient.Upload(&s3manager.UploadInput{
Bucket: aws.String(awsS3Bucket),
Key: aws.String(awsS3Destination),
Body: resp.Body, // upload image
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400783.html
上一篇:如何將兩個回傳引數合并為一個值
