본문 바로가기
내가만드는것_만든것/프로그램-공개

golang form-data 버퍼링 없이 사용하기

by Joseph.Lee 2023. 4. 24.

https://github.com/jc-lab/go-form-data

 

GitHub - jc-lab/go-form-data

Contribute to jc-lab/go-form-data development by creating an account on GitHub.

github.com

 

설치:

go get github.com/jc-lab/go-form-data

 

golang 에서 form-data 을 보내는 예제를 보면 대부분 Buffer 에 multi-part 데이터를 쓰고 전송하는 방식으로써, Memory 를 버퍼로 사용한다.

작은 데이터야 문제 없지만 수-GiB에 다르는 파일을 전송해야 한다면 사용하기 어려운 방식이다.

 

대체 왜 여기에 대한 명확한 해결책이 없을까... 하다가 라이브러리로 만들었다.

페이로드를 만들고 전송하는것이 아니라 스트림 형태로 만들어 전송한다.

 

아래 예제에서 AddDataField 를 쓰면 메모리를 사용하고, File 의 경우에는 File 을 열어 AddFileField 으로 추가하면 File 을 통해 용량 등을 파악하여, 전송 당시 데이터를 실제로 읽는다.

파일은 Request 가 완료될 때 자동으로 닫는다.

 

예제:

package main

import (
    formdata "github.com/jc-lab/go-form-data"
    "log"
    "net/http"
    "os"
)

func main() {
    formData := formdata.NewFormData()

    formData.AddDataField("aaaa", "text/plain", []byte("hello world"))

    a, _ := os.OpenFile("aaa.txt", os.O_RDONLY, 0)
    formData.AddFileField("files[]", "application/octet-stream", a)

    b, _ := os.OpenFile("bbb.txt", os.O_RDONLY, 0)
    formData.AddFileField("files[]", "application/octet-stream", b)

    req, err := http.NewRequest("POST", "http://127.0.0.1/api/upload", formData)
    if err != nil {
        log.Fatalln(err)
    }

    resp, err := formData.Do(http.DefaultClient, req)
    if err != nil {
        log.Fatalln(err)
    }

    println(resp.Status)
    println(resp.StatusCode)
    println(resp.Body)
}
반응형

'내가만드는것_만든것 > 프로그램-공개' 카테고리의 다른 글

주택 (전세) 자금 대출 계산기  (0) 2023.10.31
Golang 원격 배포 및 디버깅  (0) 2023.08.18
gRPC over Anything  (0) 2022.12.08
OBS Studio 웹으로 보기  (0) 2021.05.13
OpenWRT ISO  (0) 2021.03.08

댓글