71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
|
package helpers
|
||
|
|
||
|
import (
|
||
|
"archive/tar"
|
||
|
"archive/zip"
|
||
|
"compress/bzip2"
|
||
|
"compress/gzip"
|
||
|
"io"
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
type ReadSeekerAt interface {
|
||
|
io.Reader
|
||
|
io.Seeker
|
||
|
io.ReaderAt
|
||
|
}
|
||
|
|
||
|
func ListArchiveFiles(mimetype string, size int64, r ReadSeekerAt) (files []string, err error) {
|
||
|
if mimetype == "application/x-tar" {
|
||
|
tReadr := tar.NewReader(r)
|
||
|
for {
|
||
|
hdr, err := tReadr.Next()
|
||
|
if err == io.EOF || err != nil {
|
||
|
break
|
||
|
}
|
||
|
if hdr.Typeflag == tar.TypeDir || hdr.Typeflag == tar.TypeReg {
|
||
|
files = append(files, hdr.Name)
|
||
|
}
|
||
|
}
|
||
|
sort.Strings(files)
|
||
|
} else if mimetype == "application/x-gzip" {
|
||
|
gzf, err := gzip.NewReader(r)
|
||
|
if err == nil {
|
||
|
tReadr := tar.NewReader(gzf)
|
||
|
for {
|
||
|
hdr, err := tReadr.Next()
|
||
|
if err == io.EOF || err != nil {
|
||
|
break
|
||
|
}
|
||
|
if hdr.Typeflag == tar.TypeDir || hdr.Typeflag == tar.TypeReg {
|
||
|
files = append(files, hdr.Name)
|
||
|
}
|
||
|
}
|
||
|
sort.Strings(files)
|
||
|
}
|
||
|
} else if mimetype == "application/x-bzip" {
|
||
|
bzf := bzip2.NewReader(r)
|
||
|
tReadr := tar.NewReader(bzf)
|
||
|
for {
|
||
|
hdr, err := tReadr.Next()
|
||
|
if err == io.EOF || err != nil {
|
||
|
break
|
||
|
}
|
||
|
if hdr.Typeflag == tar.TypeDir || hdr.Typeflag == tar.TypeReg {
|
||
|
files = append(files, hdr.Name)
|
||
|
}
|
||
|
}
|
||
|
sort.Strings(files)
|
||
|
} else if mimetype == "application/zip" {
|
||
|
zf, err := zip.NewReader(r, size)
|
||
|
if err == nil {
|
||
|
for _, f := range zf.File {
|
||
|
files = append(files, f.Name)
|
||
|
}
|
||
|
}
|
||
|
sort.Strings(files)
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|