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

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

by Joseph.Lee 2023. 4. 24.

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

 

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

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

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

 

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

 

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

 

Example:

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)
}
반응형

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

Golang 원격 배포 및 디버깅  (0) 2023.08.18
gRPC over Anything  (0) 2022.12.08
OBS Studio 웹으로 보기  (0) 2021.05.13
OpenWRT ISO  (0) 2021.03.08
haiip 리눅스에서 OpenVPN으로 사용하기  (1) 2021.02.16

댓글