You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.4 KiB
70 lines
1.4 KiB
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
|
|
}
|