package epubzip import ( "archive/zip" "os" ) type StorageImageReader struct { filename string fh *os.File fz *zip.Reader files map[string]*zip.File } func NewStorageImageReader(filename string) (StorageImageReader, error) { fh, err := os.Open(filename) if err != nil { return StorageImageReader{}, err } s, err := fh.Stat() if err != nil { return StorageImageReader{}, err } fz, err := zip.NewReader(fh, s.Size()) if err != nil { return StorageImageReader{}, err } files := map[string]*zip.File{} for _, z := range fz.File { files[z.Name] = z } return StorageImageReader{filename, fh, fz, files}, nil } func (e StorageImageReader) Get(filename string) *zip.File { return e.files[filename] } func (e StorageImageReader) Size(filename string) uint64 { if img, ok := e.files[filename]; ok { return img.CompressedSize64 + 30 + uint64(len(img.Name)) } return 0 } func (e StorageImageReader) Close() error { return e.fh.Close() } func (e StorageImageReader) Remove() error { return os.Remove(e.filename) }