ファイルをストリームとしてアップロードするにはどうすればよいですか?

ダグ:

http.Requestin go を使用したファイルの投稿に関するチュートリアルは多数ありますが、ほとんどの場合、次のように始まります。

file, err := os.Open(path)
if err != nil {
    return nil, err
}
fileContents, err := ioutil.ReadAll(file)

つまり、ファイル全体をメモリに読み込み、それをaに変換してBuffer、次のようなリクエストに渡します。

func send(client *http.Client, file *os.File, endpoint string) {
    body := &bytes.Buffer{}
    io.Copy(body, file)
    req, _ := http.NewRequest("POST", endpoint, body)
    resp, _ := client.Do(req)
}

大規模なファイルを投稿してメモリに読み込まないようにしたいが、その代わりにファイルを分割してスチーム処理したい場合...どのように実行しますか?

仕方:

を設定する必要がある場合はContent-Length、手動で行うことができます。次のスニペットは、ファイルと追加パラメータをストリームとしてアップロードする例です(GolangのバッファレスマルチパートPOSTに基づくコード)。

//NOTE: for simplicity, error check is omitted
func uploadLargeFile(uri, filePath string, chunkSize int, params map[string]string) {
    //open file and retrieve info
    file, _ := os.Open(filePath)
    fi, _ := file.Stat()
    defer file.Close()    

    //buffer for storing multipart data
    byteBuf := &bytes.Buffer{}

    //part: parameters
    mpWriter := multipart.NewWriter(byteBuf)
    for key, value := range params {
        _ = mpWriter.WriteField(key, value)
    }

    //part: file
    mpWriter.CreateFormFile("file", fi.Name())
    contentType := mpWriter.FormDataContentType()

    nmulti := byteBuf.Len()
    multi := make([]byte, nmulti)
    _, _ = byteBuf.Read(multi)    

    //part: latest boundary
    //when multipart closed, latest boundary is added
    mpWriter.Close()
    nboundary := byteBuf.Len()
    lastBoundary := make([]byte, nboundary)
    _, _ = byteBuf.Read(lastBoundary)

    //calculate content length
    totalSize := int64(nmulti) + fi.Size() + int64(nboundary)
    log.Printf("Content length = %v byte(s)\n", totalSize)

    //use pipe to pass request
    rd, wr := io.Pipe()
    defer rd.Close()

    go func() {
        defer wr.Close()

        //write multipart
        _, _ = wr.Write(multi)

        //write file
        buf := make([]byte, chunkSize)
        for {
            n, err := file.Read(buf)
            if err != nil {
                break
            }
            _, _ = wr.Write(buf[:n])
        }        
        //write boundary
        _, _ = wr.Write(lastBoundary)        
    }()

    //construct request with rd
    req, _ := http.NewRequest("POST", uri, rd)
    req.Header.Set("Content-Type", contentType)
    req.ContentLength = totalSize

    //process request
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    } else {
        log.Println(resp.StatusCode)
        log.Println(resp.Header)

        body := &bytes.Buffer{}
        _, _ = body.ReadFrom(resp.Body)
        resp.Body.Close()
        log.Println(body)
    }
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

ファイルをアップロードしてリストアイテムとして表示するにはどうすればよいですか?

分類Dev

PowerShell FTPSスクリプト(SSL)を作成して単一のファイルをアップロードするにはどうすればよいですか?

分類Dev

webapiアップロードでマルチパートファイルのストリームを取得するにはどうすればよいですか?

分類Dev

Flurlを使用してファイルとフォームデータをアップロードするにはどうすればよいですか?

分類Dev

ページのリロード/更新がフォームと呼ばれるajaxを送信し、テキストとアップロードされたファイル/画像を取得するのを防ぐにはどうすればよいですか?

分類Dev

SailsJSスキッパーがrootとしてファイルをアップロードしていますが、アプリの所有者としてアップロードするにはどうすればよいですか?

分類Dev

コマンドを使用してgithubリポジトリにファイルをアップロードするにはどうすればよいですか?

分類Dev

cPanelを使用してPHPファイルとデータベースをアップロードするにはどうすればよいですか?

分類Dev

FirebaseRealtimeデータベースとReactNativeを使用して画像/ファイルをアップロードするにはどうすればよいですか?

分類Dev

Railsを使用してカスタムファイルアップロード検証モデルを追加するにはどうすればよいですか?

分類Dev

Backbone.js、jQuery、Node.jsを使用して、フォームのファイルをシリアル化してアップロードし、mongoデータベースに保存できるようにするにはどうすればよいですか?

分類Dev

キー検証システムにファイルアップロードプロンプトを追加するにはどうすればよいですか?

分類Dev

Djangoを介してアップロードされたテキストファイルを表示するにはどうすればよいですか?

分類Dev

カスタムメニューオプションとしてスプレッドシートにファイルアップロードを追加するにはどうすればよいですか?

分類Dev

空手UIテスト自動化について、空手クロームを使用しているときにファイルをアップロードするにはどうすればよいですか?

分類Dev

モーダルとJqueryを使用してファイルをテーブルにアップロードするにはどうすればよいですか?

分類Dev

アップロードしようとしている複数のファイルの名前を取得するにはどうすればよいですか?

分類Dev

フォームの代わりに `curl`を使用してファイルをアップロードするにはどうすればよいですか?

分類Dev

Springでフォーム値を使用してファイルをアップロードするにはどうすればよいですか?

分類Dev

iPhoneアプリを介してファイル(csv)ファイルを安全なストレージスペースに安全にアップロードするにはどうすればよいですか?(xcode、セキュア)

分類Dev

UNCパスを使用して内部ネットワークにファイルをアップロードするようにAzureアプリサービスを構成するにはどうすればよいですか?

分類Dev

jqueryバリデーターを使用して、フォームを送信する前にファイルがアップロード用に選択されているかどうかを検証するにはどうすればよいですか?

分類Dev

アップロードしたCSVファイルをフラスコアプリで使用するにはどうすればよいですか?

分類Dev

ヘッダーのないアップストリームフラットファイルの構造変更に続いて、新しいインポートコードを生成するにはどうすればよいですか?

分類Dev

Spring Hibernate MVCを使用してCSVファイルをデータベースにアップロードするにはどうすればよいですか?

分類Dev

文字列をファイルとしてGoogleドライブにアップロードするにはどうすればよいですか?

分類Dev

RデータフレームをCSVファイルとしてAzureBLOBストレージにアップロードするにはどうすればよいですか?

分類Dev

Asp.NET Core 3.1フレームワークを使用してサーバーにファイルをアップロードするときにプロパティとしてIFormFileを使用するにはどうすればよいですか?

分類Dev

サイプレスでxpathを使用してファイルをアップロードするにはどうすればよいですか?

Related 関連記事

  1. 1

    ファイルをアップロードしてリストアイテムとして表示するにはどうすればよいですか?

  2. 2

    PowerShell FTPSスクリプト(SSL)を作成して単一のファイルをアップロードするにはどうすればよいですか?

  3. 3

    webapiアップロードでマルチパートファイルのストリームを取得するにはどうすればよいですか?

  4. 4

    Flurlを使用してファイルとフォームデータをアップロードするにはどうすればよいですか?

  5. 5

    ページのリロード/更新がフォームと呼ばれるajaxを送信し、テキストとアップロードされたファイル/画像を取得するのを防ぐにはどうすればよいですか?

  6. 6

    SailsJSスキッパーがrootとしてファイルをアップロードしていますが、アプリの所有者としてアップロードするにはどうすればよいですか?

  7. 7

    コマンドを使用してgithubリポジトリにファイルをアップロードするにはどうすればよいですか?

  8. 8

    cPanelを使用してPHPファイルとデータベースをアップロードするにはどうすればよいですか?

  9. 9

    FirebaseRealtimeデータベースとReactNativeを使用して画像/ファイルをアップロードするにはどうすればよいですか?

  10. 10

    Railsを使用してカスタムファイルアップロード検証モデルを追加するにはどうすればよいですか?

  11. 11

    Backbone.js、jQuery、Node.jsを使用して、フォームのファイルをシリアル化してアップロードし、mongoデータベースに保存できるようにするにはどうすればよいですか?

  12. 12

    キー検証システムにファイルアップロードプロンプトを追加するにはどうすればよいですか?

  13. 13

    Djangoを介してアップロードされたテキストファイルを表示するにはどうすればよいですか?

  14. 14

    カスタムメニューオプションとしてスプレッドシートにファイルアップロードを追加するにはどうすればよいですか?

  15. 15

    空手UIテスト自動化について、空手クロームを使用しているときにファイルをアップロードするにはどうすればよいですか?

  16. 16

    モーダルとJqueryを使用してファイルをテーブルにアップロードするにはどうすればよいですか?

  17. 17

    アップロードしようとしている複数のファイルの名前を取得するにはどうすればよいですか?

  18. 18

    フォームの代わりに `curl`を使用してファイルをアップロードするにはどうすればよいですか?

  19. 19

    Springでフォーム値を使用してファイルをアップロードするにはどうすればよいですか?

  20. 20

    iPhoneアプリを介してファイル(csv)ファイルを安全なストレージスペースに安全にアップロードするにはどうすればよいですか?(xcode、セキュア)

  21. 21

    UNCパスを使用して内部ネットワークにファイルをアップロードするようにAzureアプリサービスを構成するにはどうすればよいですか?

  22. 22

    jqueryバリデーターを使用して、フォームを送信する前にファイルがアップロード用に選択されているかどうかを検証するにはどうすればよいですか?

  23. 23

    アップロードしたCSVファイルをフラスコアプリで使用するにはどうすればよいですか?

  24. 24

    ヘッダーのないアップストリームフラットファイルの構造変更に続いて、新しいインポートコードを生成するにはどうすればよいですか?

  25. 25

    Spring Hibernate MVCを使用してCSVファイルをデータベースにアップロードするにはどうすればよいですか?

  26. 26

    文字列をファイルとしてGoogleドライブにアップロードするにはどうすればよいですか?

  27. 27

    RデータフレームをCSVファイルとしてAzureBLOBストレージにアップロードするにはどうすればよいですか?

  28. 28

    Asp.NET Core 3.1フレームワークを使用してサーバーにファイルをアップロードするときにプロパティとしてIFormFileを使用するにはどうすればよいですか?

  29. 29

    サイプレスでxpathを使用してファイルをアップロードするにはどうすればよいですか?

ホットタグ

アーカイブ