私は、Amazon S3への添付ファイルのアップロードを処理するマイクロサービスを作成しています。私が達成しようとしているのは、ファイルを受け入れて、それを現在の関数であるAmazon S3バケットに直接保存することです。
func upload_handler(w http.ResponseWriter, r *http.Request) {
file, header, err := r.FormFile("attachment")
if err != nil {
fmt.Fprintln(w, err)
return
}
defer file.Close()
fileSize, err := file.Seek(0, 2) //2 = from end
if err != nil {
panic(err)
}
fmt.Println("File size : ", fileSize)
bytes := make([]byte, fileSize)
// read into buffer
buffer := bufio.NewReader(file)
_, err = buffer.Read(bytes)
auth := aws.Auth{
AccessKey: "XXXXXXXXXXX",
SecretKey: "SECRET_KEY_HERE",
}
client := s3.New(auth, aws.EUWest)
bucket := client.Bucket("attachments")
err = bucket.Put(header.Filename, bytes, header.Header.Get("Content-Type"), s3.ACL("public-read"))
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
問題は、S3に保存されているファイルがすべて破損していることです。小さな検証の後、ファイルのペイロードがバイトとして読み取られていないようです
ファイルをバイトに変換してS3に正しく保存する方法は?
使用ioutil.ReadAll
:
bs, err := ioutil.ReadAll(file)
// ...
err = bucket.Put(
header.Filename,
bs,
header.Header.Get("Content-Type"),
s3.ACL("public-read"),
)
Read
微妙な動作をする下位レベルの関数です:
Readはデータをpに読み込みます。pに読み込まれたバイト数を返します。基になるReaderでReadを最大で1回呼び出すため、nはlen(p)よりも小さい場合があります。EOFでは、カウントはゼロになり、errはio.EOFになります。
したがって、おそらく起こっていたのは、ファイルデータの一部が0の束とともにS3に書き込まれていたことです。
ioutil.ReadAll
Read
ファイルの最後に到達するまで、動的に拡張するバッファを何度も繰り返し呼び出して機能します。(したがってbufio.Reader
どちらも必要ありません)
また、Put
関数は大きなファイルで問題が発生するため(ReadAll
ファイル全体がメモリに収まる必要があることを意味します)、PutReader
代わりに使用したい場合があります。
bucket.PutReader(
header.Filename,
file,
fileSize,
header.Header.Get("Content-Type"),
s3.ACL("public-read"),
)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加