func (bi BlobInfo) String() string { b1 := new(bytes.Buffer) b1.WriteString("FN: " + stringspb.LowerCasedUnderscored(bi.Filename)) b1.WriteString(" Type: " + bi.ContentType) b1.WriteString(" " + fmt.Sprintf("%v", bi.Size/1024) + "KB") b1.WriteString(" BlobKey:" + fmt.Sprintf("%v", bi.BlobKey)) return b1.String() }
// This was an attempt, to "catch" the uploaded blob // and store it by myself into the datastore - // where I would be able to delete it. // But this failed - the actual blob data does not even reach the appengine. // Only the blob-info data. func dataStoreClone(w http.ResponseWriter, r *http.Request, blob0 *BlobInfo, otherFormFields url.Values) { return c := appengine.NewContext(r) wbl := dsu.WrapBlob{} wbl.Category = "print" wbl.Name = otherFormFields["title"][0] + " - " + otherFormFields["descr"][0] wbl.Name += " - " + stringspb.LowerCasedUnderscored(blob0.Filename) wbl.Desc = fmt.Sprintf("%v", blob0.BlobKey) wbl.S = blob0.ContentType if len(otherFormFields["post_field_file"]) > 0 { filecontent := otherFormFields["post_field_file"][0] wbl.VByte = []byte(filecontent) } keyX2 := "bl" + time.Now().Format("060102_1504-05") _, errDS := dsu.BufPut(c, wbl, keyX2) loghttp.E(w, r, errDS, false) }
func parseFurther(w http.ResponseWriter, r *http.Request, saveImages bool) { c := appengine.NewContext(r) b := new(bytes.Buffer) defer func() { w.Header().Set("Content-type", "text/plain; charset=utf-8") w.Write(b.Bytes()) }() // Get the item from the memcache wb1 := new(dsu.WrapBlob) ok := dsu.McacheGet(c, keyLatest, wb1) loghttp.E(w, r, ok, true) if ok { b.WriteString(sp("name %v\n", wb1.Name)) b.WriteString(sp("S (boundary): %q\n", wb1.S)) // dumps the entire body // b.WriteString(sp("B: %v\n", string(wb1.VByte))) // instead we split it by multipart mime vb := bytes.Split(wb1.VByte, []byte("--"+wb1.S)) for i, v := range vb { h := "" // header fn := "" // filename s := string(v) s = strings.Trim(s, "\r \n") ctype := "" b.WriteString(sp("\n___________mime boundary index %v___________\n", i)) if strings.HasPrefix(s, "Content-Type: image/png;") || strings.HasPrefix(s, "Content-Type: image/jpeg;") { if start := strings.Index(s, sepHeaderContent); start > 0 { h = s[:start] vh := strings.Split(h, "\r\n") for _, v := range vh { v := strings.TrimSpace(v) // b.WriteString("\t\t" + v + "\n") if strings.HasPrefix(v, "name=") { vv := strings.Split(v, "=") fn = stringspb.LowerCasedUnderscored(vv[1]) } } s = s[start+len(sepHeaderContent):] if posSemicol := strings.Index(h, ";"); posSemicol > 0 { ctype = h[0:posSemicol] } } } if ctype == "" { b.WriteString("unparseable: " + stringspb.Ellipsoider(s, 400)) } else { b.WriteString(sp("\n\tctype=%v\n\t------------", ctype)) if fn != "" { b.WriteString(sp("\n\tfilename=%v\n\t------------", fn)) } if saveImages { rE := resEntry{} rE.when = util.TimeMarker() rE.contentType = ctype rE.fn = fn rE.b64Img = &s Images[reservoirRevolver%reservoirSize] = rE reservoirRevolver++ aelog.Infof(c, "Put image into reservoir %v %v", fn, ctype) } } } } }