Go with Baraka에서 간단한 멀티파트 파일 업로드 처리
ParseMultipartForm을 사용하면 안 되는 이유와 이야기
그 전에는
ParseMultipartForm
로 파일을 처리하고 있었는데 파일 업로드 엔드포인트가 있을 때 HTTP API를 만들고 일부 파일 처리 코드를 다시 작성했기 때문에 코드를 최소화하기 위해 미니 라이브러리를 만들기로 결정했습니다. 라이브러리를 코딩하면서 ParseMultipartForm
기능을 검사했는데 뭔가 잘못되었습니다.ParseMultipartForm
를 사용하면 http 요청의 모든 파일이 메모리나 디스크에 보관됩니다.ParseMultipartForm
에 최대 크기 매개변수가 있더라도 이 매개변수는 디스크가 아니라 할당할 최대 메모리를 나타냅니다.예를 들어 최대 크기를 32MB로 설정하면 파일을 메모리에 최대 32MB까지 저장할 수 있습니다. 요청에 50MB 파일이 있는 경우 디스크에만 보관할 수 있습니다.
따라서 요청 크기를 제한하고 수정하거나 그냥 사용할 수 있습니다
MultipartReader
. Baraka는 그것을 사용하고 사용하기 쉽게 만들고 몇 가지 기능을 제공합니다.종속성
진고닉(선택 사항)
go get -u github.com/gin-gonic/gin
바라카
go get github.com/xis/baraka/v2
요청 구문 분석
파서를 만들어보자
func main() {
// create a parser
parser := baraka.NewParser(baraka.ParserOptions{
MaxFileSize: 5 << 20,
MaxFileCount: 5,
MaxParseCount: 5,
})
}
몇 가지 옵션이 있는 파서를 만들었습니다.MaxFileSize
옵션으로 최대 파일 크기를 제한할 수 있고 MaxFileCount
옵션으로 저장할 최대 파일 크기를 제한할 수 있습니다. MaxParseCount
는 파서 내부의 구문 분석 루프에 대한 제한을 설정합니다.
그런 다음 저장소를 만들어 파일을 디스크에 저장합니다.
func main() {
// create a parser
parser := baraka.NewParser(baraka.ParserOptions{
MaxFileSize: 5 << 20,
MaxFileCount: 5,
MaxParseCount: 5,
})
// here, we created a new filesystem store
store := baraka.NewFileSystemStore("./files")
}
그런 다음 http 라우터를 만듭니다. 여기서는 진을 사용했지만 그럴 필요는 없습니다.
func main() {
// create a parser
parser := baraka.NewParser(baraka.ParserOptions{
MaxFileSize: 5 << 20,
MaxFileCount: 5,
MaxParseCount: 5,
})
// here, we created a new filesystem store
store := baraka.NewFileSystemStore("./files")
// then, created a http router
router := gin.Default()
router.POST("/upload", func(c *gin.Context) {
})
router.Run()
}
핸들러 함수를 채우자
router.POST("/upload", func(c *gin.Context) {
// parse
request, err := parser.Parse(c.Request)
if err != nil {
fmt.Println(err)
}
// get the form
images, err := request.GetForm("images")
if err != nil {
fmt.Println(err)
}
})
먼저 파서를 사용하여 요청을 구문 분석했습니다parser.Parse(c.Request)
. 이것은 baraka.Request
라는 request
라는 이름을 제공합니다. request
를 사용하여 request.GetForm("form-name")
변수로 양식을 얻을 수 있습니다. GetForm
메서드는 내부에 파일(부분)이 있는 배열을 제공합니다. 부품과 파일을 같은 것으로 생각할 수 있습니다.
양식의 첫 번째 부분을 얻자.
part := images[0]
부분의 바이트 또는 부분에 대한 일부 정보를 얻을 수 있습니다.
part := images[0]
part.Name // gives you the part's name
part.Headers // gives you the part's headers
part.Size // gives you the part's size
part.Content // gives you the part's bytes
part.Extension // gives you the part's extension
따라서 이러한 정보로 많은 작업을 수행할 수 있습니다.
부품 저장
이전에는 파일 시스템 저장소를 만들었습니다. 이 방법을 사용하여 부품을 저장할 수 있습니다.
err = store.Save("path", "filename", part)
if err != nil {
fmt.Println(err)
}
파일 필터링
파일 형식을 필터링해야 하는 경우 이 기능을 사용할 수 있습니다. 부품의 콘텐츠 유형과 같은 속성별로 부품을 필터링할 수 있습니다. 파서는 부분의 바이트를 검사하고 Inspector로 부분의 내용 유형을 감지할 수 있습니다.
이 기능을 사용하려면 파서에 추가 항목을 전달해야 합니다.
// create a parser
parser := baraka.NewParser(baraka.ParserOptions{
MaxFileSize: 5 << 20,
MaxFileCount: 5,
MaxParseCount: 5,
})
// give parser an inspector
parser.SetInspector(baraka.NewDefaultInspector(512))
// give parser a filter
parser.SetFilter(baraka.NewExtensionFilter(".jpg"))
이제 파서는 각 부분을 검사하고 Parse 함수에서 jpeg 파일만 반환합니다. 그런데 자신만의 검사기와 필터를 만들 수 있습니다.
나는 당신이 그것을 가지고 있다고 생각합니다.
종료 및 기여
이것은 기사의 끝입니다. baraka는 기고자에게 열려 있습니다. 문제를 열어 논의하고, 기능을 제안하고, 버그 수정 등을 합니다.
안녕!
시스
/
바라카
파일 업로드를 간단하게 처리하는 도구
바라카
http 서버용 파일 업로드 처리 도구
http 요청에서 파일로 작업을 더 쉽게 만들 수 있습니다.
내용물
go get -u github.com/gin-gonic/gin
go get github.com/xis/baraka/v2
func main() {
// create a parser
parser := baraka.NewParser(baraka.ParserOptions{
MaxFileSize: 5 << 20,
MaxFileCount: 5,
MaxParseCount: 5,
})
}
func main() {
// create a parser
parser := baraka.NewParser(baraka.ParserOptions{
MaxFileSize: 5 << 20,
MaxFileCount: 5,
MaxParseCount: 5,
})
// here, we created a new filesystem store
store := baraka.NewFileSystemStore("./files")
}
func main() {
// create a parser
parser := baraka.NewParser(baraka.ParserOptions{
MaxFileSize: 5 << 20,
MaxFileCount: 5,
MaxParseCount: 5,
})
// here, we created a new filesystem store
store := baraka.NewFileSystemStore("./files")
// then, created a http router
router := gin.Default()
router.POST("/upload", func(c *gin.Context) {
})
router.Run()
}
router.POST("/upload", func(c *gin.Context) {
// parse
request, err := parser.Parse(c.Request)
if err != nil {
fmt.Println(err)
}
// get the form
images, err := request.GetForm("images")
if err != nil {
fmt.Println(err)
}
})
part := images[0]
part := images[0]
part.Name // gives you the part's name
part.Headers // gives you the part's headers
part.Size // gives you the part's size
part.Content // gives you the part's bytes
part.Extension // gives you the part's extension
err = store.Save("path", "filename", part)
if err != nil {
fmt.Println(err)
}
// create a parser
parser := baraka.NewParser(baraka.ParserOptions{
MaxFileSize: 5 << 20,
MaxFileCount: 5,
MaxParseCount: 5,
})
// give parser an inspector
parser.SetInspector(baraka.NewDefaultInspector(512))
// give parser a filter
parser.SetFilter(baraka.NewExtensionFilter(".jpg"))
이것은 기사의 끝입니다. baraka는 기고자에게 열려 있습니다. 문제를 열어 논의하고, 기능을 제안하고, 버그 수정 등을 합니다.
안녕!
시스 / 바라카
파일 업로드를 간단하게 처리하는 도구
바라카
http 서버용 파일 업로드 처리 도구
http 요청에서 파일로 작업을 더 쉽게 만들 수 있습니다.
내용물
설치
go get github.com/xis/baraka/v2
간단한 사용법
func main() { // create a parser parser := baraka.NewParser(baraka.ParserOptions{ MaxFileSize: 5 << 20 MaxFileCount: 5 MaxParseCount: 5 }) store := baraka.NewFileSystemStore("./files") router := gin.Default() router.POST("/upload", func(c *gin.Context) { // parse request, err := parser.Parse(c.Request) if err != nil { fmt.Println(err) } // get the form images, err := request.GetForm("images") if err != nil { fmt.Println(err) } // save…
View on GitHub
Reference
이 문제에 관하여(Go with Baraka에서 간단한 멀티파트 파일 업로드 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/xis/handling-multipart-file-uploads-simple-in-go-with-baraka-528i텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)