1 回答
TA贡献1886条经验 获得超2个赞
你曾经zip.Writer
压缩过数据。您必须通过调用它的方法来关闭它Writer.Close()
。并且您必须使用zip.Reader
它来读取它,并使用Reader.Open()
您在压缩它时使用的相同名称 ( file.name
)。
这就是它的样子:
func UnzipBytes(name string, zippedBytes []byte) ([]byte, error) {
reader := bytes.NewReader(zippedBytes)
zipReader, err := zip.NewReader(reader, int64(len(zippedBytes)))
if err != nil {
return nil, err
}
f, err := zipReader.Open(name)
if err != nil {
panic(err)
}
p, err := ioutil.ReadAll(f)
if err != nil {
return nil, err
}
return p, nil
}
测试它:
filename := "test.txt"
filecontent := []byte("line1\nline2")
buffer := new(bytes.Buffer)
zipWriter := zip.NewWriter(buffer)
zipFile, err := zipWriter.Create(filename)
if err != nil {
panic(err)
}
if _, err = zipFile.Write(filecontent); err != nil {
panic(err)
}
if err = zipWriter.Close(); err != nil {
panic(err)
}
decoded, err := UnzipBytes(filename, buffer.Bytes())
fmt.Println(err)
fmt.Println(string(decoded))
这将输出(在Go Playground上尝试):
<nil>
line1
line2
如果你解压的时候不知道名字,你可能会在Reader.Files头域看到所有的文件。您可以选择打开第一个文件:
func UnzipBytes(zippedBytes []byte) ([]byte, error) {
reader := bytes.NewReader(zippedBytes)
zipReader, err := zip.NewReader(reader, int64(len(zippedBytes)))
if err != nil {
return nil, err
}
if len(zipReader.File) == 0 {
return nil, nil // No file to open / extract
}
f, err := zipReader.File[0].Open()
if err != nil {
panic(err)
}
p, err := ioutil.ReadAll(f)
if err != nil {
return nil, err
}
return p, nil
}
这输出相同。在Go Playground试试这个。
- 1 回答
- 0 关注
- 243 浏览
添加回答
举报