我正在写一个web服务器.
在其中一个页面上,用户可以上传文件.
我希望能够处理zip文件.
在archive/zip
包中,我只看到两个允许我从zip存档中读取的函数:
func OpenReader(name string) (*ReadCloser, error)
func NewReader(r io.ReaderAt, size int64) (*Reader, error)
我想避免从磁盘写入和读回,
如果我想使用第二个函数,我需要在调用函数之前知道上传文件的大小.
题
我将把问题分成两部分:
阅读通过标准multipart/form-data
html表单上传的zip文件的解压缩内容的惯用方法是什么?
如何获取通过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)这是我发现的获取尺寸的方法:
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)
我不认为这个解决方案非常优雅或惯用。
没有一些更干净的方法来处理这种情况吗?