Mitchell Hashimoto による goamz フォークによって提供される PutPart メソッドを使用しようとしています。悲しいことに、パーツを取り戻してサイズを確認するたびに、それは単なるチャンクではなく、ファイル全体のサイズであると考えているようです。
例えば
15m のファイルをアップロードすると、
Uploading...
Processing 1 part of 3 and uploaded 5242880.0 bytes.
Processing 2 part of 3 and uploaded 5242880.0 bytes.
Processing 3 part of 3 and uploaded 5242880.0 bytes.
代わりに、次のように表示されます。
Uploading...
Processing 1 part of 3 and uploaded 15728640 bytes.
Processing 2 part of 3 and uploaded 15728640 bytes.
Processing 3 part of 3 and uploaded 15728640 bytes.
これは file.Read(partBuffer) の問題によるものですか? どんな助けでも大歓迎です。
Macでgo 1.5.1を使用しています。
package main
import (
"bufio"
"fmt"
"math"
"net/http"
"os"
"github.com/mitchellh/goamz/aws"
"github.com/mitchellh/goamz/s3"
)
func check(err error) {
if err != nil {
panic(err)
}
}
func main() {
fmt.Println("Test")
auth, err := aws.GetAuth("XXXXX", "XXXXXXXXXX")
check(err)
client := s3.New(auth, aws.USWest2)
b := s3.Bucket{
S3: client,
Name: "some-bucket",
}
fileToBeUploaded := "testfile"
file, err := os.Open(fileToBeUploaded)
check(err)
defer file.Close()
fileInfo, _ := file.Stat()
fileSize := fileInfo.Size()
bytes := make([]byte, fileSize)
// read into buffer
buffer := bufio.NewReader(file)
_, err = buffer.Read(bytes)
check(err)
filetype := http.DetectContentType(bytes)
// set up for multipart upload
multi, err := b.InitMulti("/"+fileToBeUploaded, filetype, s3.ACL("bucket-owner-read"))
check(err)
const fileChunk = 5242880 // 5MB
totalPartsNum := uint64(math.Ceil(float64(fileSize) / float64(fileChunk)))
parts := []s3.Part{}
fmt.Println("Uploading...")
for i := uint64(1); i < totalPartsNum; i++ {
partSize := int(math.Min(fileChunk, float64(fileSize-int64(i*fileChunk))))
partBuffer := make([]byte, partSize)
_, err := file.Read(partBuffer)
check(err)
part, err := multi.PutPart(int(i), file) // write to S3 bucket part by part
check(err)
fmt.Printf("Processing %d part of %d and uploaded %d bytes.\n ", int(i), int(totalPartsNum), int(part.Size))
parts = append(parts, part)
}
err = multi.Complete(parts)
check(err)
fmt.Println("\n\nPutPart upload completed")
}