gifs/api

Paddy 2014-12-17 Parent:b5d88d57d587

8:03e846421572 Go to Latest

gifs/api/upload.go

Update import path. Update our import path so it will work without aliasing.

History
paddy@0 1 package api
paddy@0 2
paddy@0 3 import (
paddy@0 4 "crypto/sha1"
paddy@0 5 "encoding/hex"
paddy@0 6 "io"
paddy@0 7
paddy@5 8 "code.secondbit.org/uuid.hg"
paddy@0 9 )
paddy@0 10
paddy@5 11 func upload(store Storage, bucket, name string, data *io.PipeReader, done chan struct{}) {
paddy@5 12 err := store.Upload(bucket, name, data)
paddy@5 13 if err != nil {
paddy@5 14 data.CloseWithError(err)
paddy@5 15 return
paddy@5 16 }
paddy@5 17 close(done)
paddy@5 18 }
paddy@5 19
paddy@0 20 func Upload(collectionID uuid.ID, r io.Reader, c Context) (Item, int64, error) {
paddy@5 21 h := sha1.New()
paddy@5 22 var w io.Writer
paddy@0 23 uploadReader, uploadWriter := io.Pipe()
paddy@5 24 uploadChan := make(chan struct{})
paddy@5 25 tmp := uuid.NewID().String()
paddy@0 26
paddy@0 27 if c.Storage != nil {
paddy@5 28 w = io.MultiWriter(h, uploadWriter)
paddy@5 29 go upload(c.Storage, c.TmpBucket, tmp, uploadReader, uploadChan)
paddy@5 30 } else {
paddy@5 31 w = h
paddy@5 32 close(uploadChan)
paddy@0 33 }
paddy@0 34
paddy@5 35 size, err := io.Copy(w, r)
paddy@5 36 if err != nil {
paddy@5 37 if c.Storage != nil {
paddy@0 38 uploadWriter.Close()
paddy@0 39 }
paddy@5 40 return Item{}, 0, err
paddy@0 41 }
paddy@5 42
paddy@5 43 finalLocation := hex.EncodeToString(h.Sum(nil))
paddy@5 44 uploadWriter.Close()
paddy@5 45 <-uploadChan
paddy@5 46
paddy@0 47 if c.Storage != nil {
paddy@5 48 err = c.Storage.Move(c.TmpBucket, tmp, c.Bucket, finalLocation)
paddy@0 49 if err != nil {
paddy@0 50 return Item{}, 0, err
paddy@0 51 }
paddy@0 52 }
paddy@0 53 return Item{
paddy@0 54 Blob: finalLocation,
paddy@0 55 Bucket: c.Bucket,
paddy@0 56 CollectionID: collectionID,
paddy@5 57 }, size, nil
paddy@0 58 }