http Request.FormFile:处理zip文件?

LeG*_*GEC 7 go

我正在写一个web服务器.

在其中一个页面上,用户可以上传文件.

我希望能够处理zip文件.

archive/zip包中,我只看到两个允许我从zip存档中读取的函数:

  1. func OpenReader(name string) (*ReadCloser, error)
  2. func NewReader(r io.ReaderAt, size int64) (*Reader, error)

我想避免从磁盘写入和读回,
如果我想使用第二个函数,我需要在调用函数之前知道上传文件的大小.

我将把问题分成两部分:

  1. 阅读通过标准multipart/form-datahtml表单上传的zip文件的解压缩内容的惯用方法是什么?

  2. 如何获取通过html表单上传的文件的实际大小?

    func(req *http.Request) {
        f, h, err := req.FormFile("fileTag")
        if err != nil {
             panic(err)
        }
        var fileSize int = ??
    
        unzipper, err := zip.NewReader(f, fileSize)
    }
    
    Run Code Online (Sandbox Code Playgroud)

LeG*_*GEC 2

这是我发现的获取尺寸的方法:

func(req *http.Request) {
    f, h, err := req.FormFile("fileTag")
    if err != nil {
         panic(err)
    }
    fileSize, err := f.Seek(0, 2) //2 = from end
    if err != nil {
         panic(err)
    }
    _, err = f.Seek(0, 0)
    if err != nil {
         panic(err)
    }

    unzipper, err := zip.NewReader(f, fileSize)
}
Run Code Online (Sandbox Code Playgroud)

我不认为这个解决方案非常优雅或惯用。

没有一些更干净的方法来处理这种情况吗?