GolangがHTTPリクエストFormFileをAmazon S3にアップロードする

ハムザ:

私は、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.ReadAllReadファイルの最後に到達するまで、動的に拡張するバッファを何度も繰り返し呼び出し機能します。(したがってbufio.Readerどちらも必要ありません

また、Put関数は大きなファイルで問題が発生するため(ReadAllファイル全体がメモリに収まる必要があること意味します)、PutReader代わりに使用したい場合があります

bucket.PutReader(
    header.Filename, 
    file, 
    fileSize, 
    header.Header.Get("Content-Type"), 
    s3.ACL("public-read"),
)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    sql-ORA-00937:単一グループのグループ関数ではありません

  2. 2

    Powershellを使用して管理者として実行ショートカットを作成する方法

  3. 3

    GolangがHTTPリクエストFormFileをAmazon S3にアップロードする

  4. 4

    AWS S3 SDK-スレッドプールサイズを設定するにはどうすればよいですか?

  5. 5

    Reactでclsxを使用する方法

  6. 6

    Ansibleで複数行のシェルスクリプトを実行する方法

  7. 7

    SwiftでURLが有効かどうかを確認するにはどうすればよいですか?

  8. 8

    DatabaseError:ORA-00928:SELECTキーワードがありません

  9. 9

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  10. 10

    Azure Logic Apps:PowershellスクリプトまたはAzure CLIを実行する方法は?

  11. 11

    Eclipseをアンインストールする方法?

  12. 12

    React:Rootクラスの条件付きレンダリングが機能しませんでした

  13. 13

    レンダリング後のdivの動的幅の取得

  14. 14

    Microsoft Edge WebブラウザでJavaを有効にするにはどうすればよいですか?

  15. 15

    TestInitメソッドでHttpContext.Currentをモックします

  16. 16

    SeleniumとPythonを使用してdiv内の値を見つける方法

  17. 17

    シェープファイルからTopojsonへの変換

  18. 18

    std :: binary_functionの置き換え

  19. 19

    Open Weather Map APIによって提供されるJSON天気予報を明確にする方法は?

  20. 20

    マルチレベルのグループ化でHTMLテーブルにデータを表示する

  21. 21

    「java.library.pathにocijdbc11がありません」SQLDeveloperエラーの対処方法

ホットタグ

アーカイブ