作者:ninneman
项目:ninneman.or
func (photo *Photo) Upload(r *http.Request) (err error) {
c := appengine.NewContext(r)
blob, err := blobstore.Create(c, r.Header.Get("X-File-Type"))
if err != nil {
return
}
defer r.Body.Close()
//body, err := ioutil.ReadAll(r.Body)
var buf bytes.Buffer
io.Copy(&buf, r.Body)
_, err = blob.Write(buf.Bytes())
if err != nil {
return
}
_ = blob.Close()
key, err := blob.Key()
if err != nil {
return
}
photo.Blob = string(key)
err = photo.CreateThumb(r, buf)
if err != nil {
log.Println(err)
err = blobstore.Delete(c, key)
err = errors.New("Failed to upload image")
}
return
}
作者:ThePiach
项目:GAE-Go-Datastor
func PutInBlobstore(c appengine.Context, toStore interface{}) (appengine.BlobKey, error) {
//TODO: check capabilities
var k appengine.BlobKey
var data bytes.Buffer
enc := gob.NewEncoder(&data)
err := enc.Encode(toStore)
if err != nil {
c.Errorf("Datastore - PutInBlobstore - error 1 - %s", err)
return k, err
}
w, err := blobstore.Create(c, "application/octet-stream")
if err != nil {
c.Errorf("Datastore - PutInBlobstore - error 2 - %s", err)
return k, err
}
_, err = w.Write(data.Bytes())
if err != nil {
c.Errorf("Datastore - PutInBlobstore - error 3 - %s", err)
return k, err
}
err = w.Close()
if err != nil {
c.Errorf("Datastore - PutInBlobstore - error 4 - %s", err)
return k, err
}
k, err = w.Key()
if err != nil {
c.Errorf("Datastore - PutInBlobstore - error 5 - %s", err)
}
return k, err
}
作者:dbratu
项目:impac
func saveBlob(context appengine.Context, mimeType string, saveFunc func(*blobstore.Writer) error) (appengine.BlobKey, error) {
var blobWriter *blobstore.Writer
if w, err := blobstore.Create(context, mimeType); err == nil {
blobWriter = w
} else {
return "", err
}
if err := saveFunc(blobWriter); err != nil {
return "", err
}
if err := blobWriter.Close(); err != nil {
return "", err
}
if k, err := blobWriter.Key(); err == nil {
return k, nil
} else {
return "", err
}
return "", nil
}
作者:shaundunca
项目:goplacecreatur
func (c Creature) Import(context appengine.Context) {
if c.Exists(context) {
return
}
// Fetch the source contents
client := urlfetch.Client(context)
resp, err := client.Get(c.Source)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
// Store the Blob
writer, _ := blobstore.Create(context, "image/jpeg")
writer.Write(data)
writer.Close()
c.BlobKey, _ = writer.Key()
c.Save(context)
}
作者:omairraza
项目:bap
func handleUpload(r *http.Request, p *multipart.Part) (fi *FileInfo) {
fi = &FileInfo{
Name: p.FileName(),
Type: p.Header.Get("Content-Type"),
}
if !fi.ValidateType() {
return
}
defer func() {
if rec := recover(); rec != nil {
log.Println(rec)
fi.Error = rec.(error).Error()
}
}()
lr := &io.LimitedReader{R: p, N: MAX_FILE_SIZE + 1}
context := appengine.NewContext(r)
w, err := blobstore.Create(context, fi.Type)
defer func() {
w.Close()
fi.Size = MAX_FILE_SIZE + 1 - lr.N
fi.Key, err = w.Key()
check(err)
if !fi.ValidateSize() {
err := blobstore.Delete(context, fi.Key)
check(err)
return
}
delayedDelete(context, fi)
fi.CreateUrls(r, context)
}()
check(err)
_, err = io.Copy(w, lr)
return
}
作者:mufniar
项目:OLM
func uploadBlob(w http.ResponseWriter, r *http.Request) {
bodyData, error := ioutil.ReadAll(r.Body)
fileType := r.URL.Query()["type"][0]
var mimeType string
if fileType == "png" {
mimeType = "image/png"
} else {
mimeType = "application/pdf"
}
context := appengine.NewContext(r)
writer, error := blobstore.Create(context, mimeType)
if error != nil {
return
}
_, error = writer.Write(bodyData)
if error != nil {
return
}
error = writer.Close()
if error != nil {
return
}
var k appengine.BlobKey
k, _ = writer.Key()
encoder := json.NewEncoder(w)
encoder.Encode(&UploadBlobResponse{Key: string(k)})
}
作者:Raner
项目:gorea
func loadImage(c appengine.Context, f *Feed) string {
s := f.Link
if s == "" {
s = f.Url
}
u, err := url.Parse(s)
if err != nil {
return ""
}
u.Path = "/favicon.ico"
u.RawQuery = ""
u.Fragment = ""
g := goon.FromContext(c)
i := &Image{Id: u.String()}
if err := g.Get(i); err == nil {
return i.Url
}
client := urlfetch.Client(c)
r, err := client.Get(u.String())
if err != nil || r.StatusCode != http.StatusOK || r.ContentLength == 0 {
return ""
}
b, err := ioutil.ReadAll(r.Body)
r.Body.Close()
if err != nil {
return ""
}
buf := bytes.NewBuffer(b)
_, t, err := image.DecodeConfig(buf)
if err != nil {
t = "application/octet-stream"
} else {
t = "image/" + t
}
w, err := blobstore.Create(c, t)
if err != nil {
return ""
}
if _, err := w.Write(b); err != nil {
return ""
}
if w.Close() != nil {
return ""
}
i.Blob, _ = w.Key()
su, err := aimage.ServingURL(c, i.Blob, &aimage.ServingURLOptions{Size: 16})
if err != nil {
if err = blobstore.Delete(c, i.Blob); err != nil {
c.Errorf("blob delete err: %v", err)
}
return ""
}
i.Url = su.String()
g.Put(i)
return i.Url
}
作者:clicker36
项目:ebfmex-pu
func UpdateServingLogoUrl(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
const batch = 50
page, _ := strconv.Atoi(r.FormValue("pg"))
if page < 1 {
page = 1
}
offset := batch * (page - 1)
q := datastore.NewQuery("EmpLogo").Offset(offset).Order("IdEmp").Limit(batch)
n, _ := q.Count(c)
for i := q.Run(c); ; {
var e model.Image
key, err := i.Next(&e)
if err == datastore.Done {
break
}
// Se crea la URL para servir la oferta desde el CDN, si no se puede
// se deja en blanco
var imgprops image.ServingURLOptions
imgprops.Secure = true
imgprops.Size = 180
imgprops.Crop = false
if e.Sp4 == "" && e.IdEmp != "" {
var blobkey appengine.BlobKey
blob, err := blobstore.Create(c, "image/jpeg")
if err != nil {
c.Errorf("blobstore Create: %v", e.IdEmp)
}
_, err = blob.Write(e.Data)
if err != nil {
c.Errorf("blobstore Write: %v", e.IdEmp)
}
err = blob.Close()
if err != nil {
c.Errorf("blobstore Close: %v", e.IdEmp)
}
blobkey, err = blob.Key()
if err != nil {
c.Errorf("blobstore Key Gen: %v", e.IdEmp)
}
if url, err := image.ServingURL(c, blobkey, &imgprops); err != nil {
c.Errorf("Cannot construct EmpLogo ServingURL : %v", e.IdEmp)
} else {
e.Sp3 = string(blobkey)
e.Sp4 = url.String()
}
_, err = datastore.Put(c, key, &e)
if err != nil {
c.Errorf("PutEmpLogo(); Error al intentar actualizar Emplogo : %v", e.IdEmp)
}
}
}
c.Infof("UpdateServingLogoUrl() Pagina: %d, actualizados: %d, del %d al %d", page, n, offset, offset+n)
return
}
作者:baiju
项目:gorea
func saveFile(c appengine.Context, b []byte) (appengine.BlobKey, error) {
w, err := blobstore.Create(c, "application/json")
if err != nil {
return "", err
}
if _, err := w.Write(b); err != nil {
return "", err
}
if err := w.Close(); err != nil {
return "", err
}
return w.Key()
}
作者:TheAustrianPr
项目:overlay-tile
// createBlob stores a blob in the blobstore.
func createBlob(c appengine.Context, r io.Reader, contentType string) (appengine.BlobKey, error) {
w, err := blobstore.Create(c, contentType)
if err != nil {
return "", err
}
if _, err := io.Copy(w, r); err != nil {
return "", err
}
if err := w.Close(); err != nil {
return "", err
}
return w.Key()
}
作者:ipee
项目:camlistor
func (sto *appengineStorage) ReceiveBlob(br *blobref.BlobRef, in io.Reader) (sb blobref.SizedBlobRef, err os.Error) {
if sto.ctx == nil {
err = errNoContext
return
}
var b bytes.Buffer
hash := br.Hash()
written, err := io.Copy(io.MultiWriter(hash, &b), in)
if err != nil {
return
}
if !br.HashMatches(hash) {
err = blobserver.ErrCorruptBlob
return
}
mimeType := "application/octet-stream"
bw, err := blobstore.Create(sto.ctx, mimeType)
if err != nil {
return
}
written, err = io.Copy(bw, &b)
if err != nil {
// TODO(bradfitz): try to clean up; close it, see if we can find the key, delete it.
return
}
err = bw.Close()
if err != nil {
// TODO(bradfitz): try to clean up; see if we can find the key, delete it.
return
}
bkey, err := bw.Key()
if err != nil {
return
}
var ent blobEnt
ent.BlobRefStr = br.String()
ent.Size = written
ent.BlobKey = bkey
dkey := datastore.NewKey(sto.ctx, blobKind, br.String(), 0, nil)
_, err = datastore.Put(sto.ctx, dkey, &ent)
if err != nil {
blobstore.Delete(sto.ctx, bkey) // TODO: insert into task queue on error to try later?
return
}
return blobref.SizedBlobRef{br, written}, nil
}
作者:henglinl
项目:goblo
func newBlob(c appengine.Context, p []byte) (appengine.BlobKey, error) {
var k appengine.BlobKey
w, err := blobstore.Create(c, "text/plain")
if err != nil {
return k, err
}
_, err = w.Write(p)
if err != nil {
return k, err
}
err = w.Close()
if err != nil {
return k, err
}
return w.Key()
}
作者:janjis
项目:go_meetu
func fetch(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
imageUrl := r.FormValue("image")
c.Infof("THIS IS IMAGE URL %v", imageUrl)
client := urlfetch.Client(c)
resp, err := client.Get(imageUrl)
if error3(err, c, w) {
return
}
blob, err := blobstore.Create(c, resp.Header.Get("Content-Type"))
if error3(err, c, w) {
return
}
written, err := io.Copy(blob, resp.Body)
if error3(err, c, w) {
return
}
if written < 100 {
c.Infof("image is too small %v", written)
return
}
err = blob.Close()
if error3(err, c, w) {
return
}
blobkey, err := blob.Key()
if error3(err, c, w) {
return
}
thumbnailUrl, err := image.ServingURL(c, blobkey, &image.ServingURLOptions{Size: 100})
if error3(err, c, w) {
return
}
t := thumbnailUrl.String()
errr := channel.Send(c, "qwerty", t)
if error3(errr, c, w) {
return
}
// c.Infof("THIS IS IMAGE URL %v", t)
}
作者:vidos
项目:goinbo
func (m *Message) images2urls(c appengine.Context) {
urlc := make(chan string)
for _, im := range m.images {
go func(img *img_attachment) {
w, err := blobstore.Create(c, img.Type)
if err != nil {
urlc <- err.Error()
return
}
_, err = w.Write(img.Data)
if err != nil {
urlc <- err.Error()
return
}
err = w.Close()
if err != nil {
urlc <- err.Error()
return
}
key, err := w.Key()
if err != nil {
urlc <- err.Error()
return
}
url, err := image.ServingURL(c, key, &image.ServingURLOptions{Secure: false, Size: 0, Crop: false})
if err != nil {
urlc <- err.Error()
return
}
urlc <- url.String()
}(&im)
}
imagescnt := len(m.images)
m.ImageUrls = make([]string, 0, imagescnt)
for i := 0; i < imagescnt; i++ {
u := <-urlc
if strings.HasPrefix(u, "http") {
m.ImageUrls = append(m.ImageUrls, u)
} else {
c.Errorf("Error converting image to url: %v", u)
}
}
return
}
作者:steliom
项目:jQuery-File-Uploa
func handleUpload(r *http.Request, p *multipart.Part) (fi *FileInfo) {
fi = &FileInfo{
Name: p.FileName(),
Type: p.Header.Get("Content-Type"),
}
if !fi.ValidateType() {
return
}
defer func() {
if rec := recover(); rec != nil {
log.Println(rec)
fi.Error = rec.(os.Error).String()
}
}()
var b bytes.Buffer
lr := &io.LimitedReader{p, MAX_FILE_SIZE + 1}
context := appengine.NewContext(r)
w, err := blobstore.Create(context, fi.Type)
defer func() {
w.Close()
fi.Size = MAX_FILE_SIZE + 1 - lr.N
fi.Key, err = w.Key()
check(err)
if !fi.ValidateSize() {
err := blobstore.Delete(context, fi.Key)
check(err)
return
}
delayedDelete(context, fi)
if b.Len() > 0 {
fi.CreateThumbnail(&b, context)
}
fi.CreateUrls(r, context)
}()
check(err)
var wr io.Writer = w
if imageTypes.MatchString(fi.Type) {
wr = io.MultiWriter(&b, w)
}
_, err = io.Copy(wr, lr)
return
}
作者:runningwil
项目:votasti
// Given an io.Reader that will supply either a png or jpg, this crops the
// image down to 100x100, encodes it as a jpg, and stores it in the blobstore.
func processImage(c appengine.Context, in io.Reader) (appengine.BlobKey, error) {
var bkey appengine.BlobKey
m, _, err := image.Decode(in)
if err != nil {
return bkey, err
}
final := image.NewRGBA(image.Rect(0, 0, 100, 100))
draw.Draw(final, image.Rect(0, 0, 100, 100), m, image.Point{}, draw.Src)
w, err := blobstore.Create(c, "application/octet-stream")
if err != nil {
return bkey, err
}
err = jpeg.Encode(w, final, nil)
if err != nil {
return bkey, err
}
err = w.Close()
if err != nil {
return bkey, err
}
return w.Key()
}
作者:rfistma
项目:camlistor
func (sto *appengineStorage) ReceiveBlob(br blob.Ref, in io.Reader) (sb blob.SizedRef, err error) {
loan := ctxPool.Get()
defer loan.Return()
ctx := loan
var b bytes.Buffer
written, err := io.Copy(&b, in)
if err != nil {
return
}
// bkey is non-empty once we've uploaded the blob.
var bkey appengine.BlobKey
// uploadBlob uploads the blob, unless it's already been done.
uploadBlob := func(ctx appengine.Context) error {
if len(bkey) > 0 {
return nil // already done in previous transaction attempt
}
bw, err := blobstore.Create(ctx, "application/octet-stream")
if err != nil {
return err
}
_, err = io.Copy(bw, &b)
if err != nil {
// TODO(bradfitz): try to clean up; close it, see if we can find the key, delete it.
ctx.Errorf("blobstore Copy error: %v", err)
return err
}
err = bw.Close()
if err != nil {
// TODO(bradfitz): try to clean up; see if we can find the key, delete it.
ctx.Errorf("blobstore Close error: %v", err)
return err
}
k, err := bw.Key()
if err == nil {
bkey = k
}
return err
}
tryFunc := func(tc appengine.Context) error {
row, err := fetchEnt(tc, br)
switch err {
case datastore.ErrNoSuchEntity:
if err := uploadBlob(tc); err != nil {
tc.Errorf("uploadBlob failed: %v", err)
return err
}
row = &blobEnt{
Size: written,
BlobKey: bkey,
Namespaces: sto.namespace,
}
_, err = datastore.Put(tc, entKey(tc, br), row)
if err != nil {
return err
}
case nil:
if row.inNamespace(sto.namespace) {
// Nothing to do
return nil
}
row.Namespaces = row.Namespaces + "|" + sto.namespace
_, err = datastore.Put(tc, entKey(tc, br), row)
if err != nil {
return err
}
default:
return err
}
// Add membership row
_, err = datastore.Put(tc, sto.memKey(tc, br), &memEnt{
Size: written,
})
return err
}
err = datastore.RunInTransaction(ctx, tryFunc, crossGroupTransaction)
if err != nil {
if len(bkey) > 0 {
// If we just created this blob but we
// ultimately failed, try our best to delete
// it so it's not orphaned.
blobstore.Delete(ctx, bkey)
}
return
}
return blob.SizedRef{br, uint32(written)}, nil
}
作者:jiacontreras
项目:gorea
func loadImage(c appengine.Context, f *Feed) {
if f.ImageDate.After(time.Now()) {
return
}
f.ImageDate = time.Now().Add(time.Hour * 24 * 7)
s := f.Link
if s == "" {
s = f.Url
}
u, err := url.Parse(s)
if err != nil {
return
}
u.RawQuery = ""
u.Fragment = ""
p := "/favicon.ico"
client := urlfetch.Client(c)
if r, err := client.Get(u.String()); err == nil {
b, err := ioutil.ReadAll(r.Body)
r.Body.Close()
if err == nil {
i, err := FindIcon(b)
if err == nil {
p = i
}
}
}
u, err = u.Parse(p)
if err != nil {
return
}
r, err := client.Get(u.String())
if err != nil || r.StatusCode != http.StatusOK || r.ContentLength == 0 {
return
}
b, err := ioutil.ReadAll(r.Body)
r.Body.Close()
if err != nil {
return
}
buf := bytes.NewBuffer(b)
_, t, err := image.DecodeConfig(buf)
if err != nil {
t = "application/octet-stream"
} else {
t = "image/" + t
}
w, err := blobstore.Create(c, t)
if err != nil {
return
}
if _, err := w.Write(b); err != nil {
return
}
if w.Close() != nil {
return
}
g := goon.FromContext(c)
i := &Image{Id: u.String()}
if err := g.Get(i); err == nil {
blobstore.Delete(c, i.Blob)
}
i.Blob, _ = w.Key()
su, err := aimage.ServingURL(c, i.Blob, &aimage.ServingURLOptions{Size: 16})
if err != nil {
if err = blobstore.Delete(c, i.Blob); err != nil {
c.Errorf("blob delete err: %v", err)
}
return
}
i.Url = su.String()
g.Put(i)
f.Image = i.Url
}
作者:Mononof
项目:automatic-diar
func storeAttachments(c appengine.Context, rawAttachments []AttachmentJSON) ([]*datastore.Key, error) {
keys := []*datastore.Key{}
for _, rawAttachment := range rawAttachments {
bytes, err := base64.StdEncoding.DecodeString(rawAttachment.Content)
if err != nil {
return nil, fmt.Errorf("failed to decode attachment '%v':",
rawAttachment.Name, err)
}
w, err := blobstore.Create(c, rawAttachment.ContentType)
if err != nil {
return nil, fmt.Errorf("failed to create blobstore entry: %v", err)
}
_, err = w.Write(bytes)
if err != nil {
return nil, fmt.Errorf("failed to write to blobstore: %v", err)
}
err = w.Close()
if err != nil {
return nil, fmt.Errorf("failed to close blobstore entry: %v", err)
}
blobKey, err := w.Key()
if err != nil {
return nil, fmt.Errorf("failed to get key for blobstore entry: %v", err)
}
thumbnailURL, err := image.ServingURL(c, blobKey, &image.ServingURLOptions{
Secure: true,
Size: 400,
Crop: false,
})
if err != nil {
return nil, fmt.Errorf("failed to create thumbnail: %v", err)
}
bigImageURL, err := image.ServingURL(c, blobKey, &image.ServingURLOptions{
Secure: true,
Size: 1600,
Crop: false,
})
if err != nil {
return nil, fmt.Errorf("failed to create big image: %v", err)
}
e := Attachment{
Name: rawAttachment.Name,
Content: blobKey,
ContentType: rawAttachment.ContentType,
CreationTime: time.Now(),
Thumbnail: thumbnailURL.String(),
BigImage: bigImageURL.String(),
}
key, err := datastore.Put(c, datastore.NewIncompleteKey(c, "Attachment", nil), &e)
if err != nil {
return nil, fmt.Errorf("Failed to save to datastore: %s", err)
}
keys = append(keys, key)
}
return keys, nil
}
作者:splad
项目:camlistor
func (sto *appengineStorage) ReceiveBlob(br *blobref.BlobRef, in io.Reader) (sb blobref.SizedBlobRef, err os.Error) {
if sto.ctx == nil {
err = errNoContext
return
}
var b bytes.Buffer
hash := br.Hash()
written, err := io.Copy(io.MultiWriter(hash, &b), in)
if err != nil {
return
}
if !br.HashMatches(hash) {
err = blobserver.ErrCorruptBlob
return
}
// bkey is non-empty once we've uploaded the blob.
var bkey appengine.BlobKey
// uploadBlob uploads the blob, unless it's already been done.
uploadBlob := func(ctx appengine.Context) os.Error {
if len(bkey) > 0 {
return nil // already done in previous transaction attempt
}
bw, err := blobstore.Create(ctx, "application/octet-stream")
if err != nil {
return err
}
_, err = io.Copy(bw, &b)
if err != nil {
// TODO(bradfitz): try to clean up; close it, see if we can find the key, delete it.
ctx.Errorf("blobstore Copy error: %v", err)
return err
}
err = bw.Close()
if err != nil {
// TODO(bradfitz): try to clean up; see if we can find the key, delete it.
ctx.Errorf("blobstore Close error: %v", err)
return err
}
k, err := bw.Key()
if err == nil {
bkey = k
}
return err
}
tryFunc := func(tc appengine.Context) os.Error {
row, err := fetchEnt(sto.ctx, br)
switch err {
case datastore.ErrNoSuchEntity:
if err := uploadBlob(sto.ctx); err != nil {
tc.Errorf("uploadBlob failed: %v", err)
return err
}
row = &blobEnt{
Size: []byte(fmt.Sprintf("%d", written)),
BlobKey: []byte(string(bkey)),
Namespaces: []byte(sto.namespace),
}
_, err = datastore.Put(tc, entKey(tc, br), row)
if err != nil {
return err
}
case nil:
if row.inNamespace(sto.namespace) {
// Nothing to do
return nil
}
row.Namespaces = []byte(string(row.Namespaces) + "|" + sto.namespace)
_, err = datastore.Put(tc, entKey(tc, br), row)
if err != nil {
return err
}
default:
return err
}
// Add membership row
_, err = datastore.Put(tc, sto.memKey(tc, br), &memEnt{
Size: []byte(fmt.Sprintf("%d", written)),
})
return err
}
err = datastore.RunInTransaction(sto.ctx, tryFunc, crossGroupTransaction)
if err != nil {
if len(bkey) > 0 {
// If we just created this blob but we
// ultimately failed, try our best to delete
// it so it's not orphaned.
blobstore.Delete(sto.ctx, bkey)
}
return
}
return blobref.SizedBlobRef{br, written}, nil
}