Go with Baraka에서 간단한 멀티파트 파일 업로드 처리

16256 단어 filemultipartgoupload
안녕하세요, 이 글에서는 Go에서 간단하게 파일 업로드를 처리하는 방법을 설명하겠습니다.

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 요청에서 파일로 작업을 더 쉽게 만들 수 있습니다.

내용물


  • Install
  • Simple Usage
  • Filtering Parts
  • More
  • Contribute
  • License

  • 설치


    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

    좋은 웹페이지 즐겨찾기