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

関連記事

AWS S3が公的に読み取り可能なオブジェクトをアップロードする

Java OutputStreamをAWS S3にアップロードする方法

Ajaxリクエストを使用してHTML、javascript、jQueryでAmazon s3に画像をアップロードする(PHPなし)

goを使用してAWS S3にファイルをアップロードするストリーム

S3に画像をアップロードするとアップロードが完了しません

Gulpを使用してs3にアセットをアップロードする

S3にアップロードするときにLambda関数がタイムアウトする

画像をs3バケットノードjsにアップロードする

アップロードした画像をDjangoでS3に保存する

sagemakerでS3にデータをアップロードする

webpackを使用してS3にアセットをアップロードする

rusotoを使用してS3に文字列をアップロードする

文字列をgzipNodejsとしてs3にアップロードする方法

ノードjsからs3に画像をアップロードする

NestJS-aws s3に画像をアップロードする方法は?

boto3 dict / json出力をs3バケットにアップロードする方法は?

アップロードせずにS3オブジェクトをトリガーする

アップロードする前にS3バケットのデフォルトを設定する

TestNgレポートをS3にアップロードする

ペーパークリップでHerokuを介してS3に画像をアップロードする

ファイルをs3に自動アップロードする方法

ファイルをs3に自動アップロードする方法

Nodeを使用してS3に画像をアップロードする方法

Amazon s3 にファイルをアップロードする - クライアント側の JavaScript

aws s3にhtmlローカルプロジェクトをアップロードする方法は?

RailsアプリからS3にアップロードした後にリダイレクトする

AmazonEducateスターターアカウントでS3に画像をアップロードする

AWS S3 v / s S3Glacierアップロードを使用してGlacierにファイルをアップロードする

react-aws-s3を使用してcsvファイルをS3にアップロードする

TOP 一覧

  1. 1

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

  2. 2

    Railsで宝石のレイアウトを使用するにはどうすればよいですか?

  3. 3

    Chromeウェブアプリのウェブビューの高さの問題

  4. 4

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

  5. 5

    アンドロイド9 - キーストア例外android.os.ServiceSpecificException

  6. 6

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  7. 7

    CSSのみを使用して三角形のアニメーションを作成する方法

  8. 8

    Google Playストア:アプリページにリーダーボードと実績のアイコン/バッジが表示されない

  9. 9

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  10. 10

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  11. 11

    Windows 7では、一部のプログラムは「ビジュアルテーマを無効にする」レジストリ設定を行いませんか?

  12. 12

    Get-ADGroupMember:このリクエストのサイズ制限を超えました

  13. 13

    Pyusb can't find a device while libusb can

  14. 14

    MySQLでJSON_LENGTHとJSON_EXTRACTを組み合わせる方法は?

  15. 15

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  16. 16

    Swiftのブロックのパラメーターに関するドキュメントのマークアップ形式は何ですか?

  17. 17

    Reactでclsxを使用する方法

  18. 18

    追加後、ブートストラップマルチセレクトがテーブルで機能しない

  19. 19

    MongoDB Compass: How to select Distinct Values of a Field

  20. 20

    「埋め込みブラウザのOAuthログイン」を有効にしてコールバックURLを指定した後でも、Facebookのコールバックエラーが発生する

  21. 21

    複数行ヘッダーのJTableヘッダーテキストの折り返し(カスタムTableCellRenderer)

ホットタグ

アーカイブ