mirror of
https://github.com/celogeek/piwigo-cli.git
synced 2025-05-25 10:12:37 +02:00
56 lines
948 B
Go
56 lines
948 B
Go
package base64
|
|
|
|
import (
|
|
"bytes"
|
|
b64 "encoding/base64"
|
|
"os"
|
|
)
|
|
|
|
var CHUNK_SIZE int64 = 1 * 1024 * 1024
|
|
var CHUNK_BUFF_SIZE int64 = 32 * 1024
|
|
var CHUNK_BUFF_COUNT = CHUNK_SIZE / CHUNK_BUFF_SIZE
|
|
|
|
type Chunk struct {
|
|
Position int64
|
|
Size int64
|
|
Buffer bytes.Buffer
|
|
}
|
|
|
|
func Chunker(filename string) (chan *Chunk, error) {
|
|
f, err := os.Open(filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
out := make(chan *Chunk, 8)
|
|
chunker := func() {
|
|
b := make([]byte, CHUNK_BUFF_SIZE)
|
|
defer f.Close()
|
|
defer close(out)
|
|
ok := false
|
|
for position := int64(0); !ok; position += 1 {
|
|
bf := &Chunk{
|
|
Position: position,
|
|
}
|
|
b64 := b64.NewEncoder(b64.StdEncoding, &bf.Buffer)
|
|
for i := int64(0); i < CHUNK_BUFF_COUNT; i++ {
|
|
n, _ := f.Read(b)
|
|
if n == 0 {
|
|
ok = true
|
|
break
|
|
}
|
|
bf.Size += int64(n)
|
|
b64.Write(b[:n])
|
|
}
|
|
b64.Close()
|
|
if bf.Size > 0 {
|
|
out <- bf
|
|
}
|
|
}
|
|
}
|
|
|
|
go chunker()
|
|
|
|
return out, nil
|
|
}
|