func (s *Server) uploads(wr http.ResponseWriter, r *http.Request) { var ( i, nn int err error vid int64 key int64 cookie int64 size int64 str string keys []string cookies []string v *volume.Volume ns *needle.Needles file multipart.File fh *multipart.FileHeader fhs []*multipart.FileHeader res = map[string]interface{}{} ) if r.Method != "POST" { http.Error(wr, "method not allowed", http.StatusMethodNotAllowed) return } defer HttpPostWriter(r, wr, time.Now(), &err, res) if err = checkContentLength(r, s.conf.NeedleMaxSize*s.conf.BatchMaxNum); err != nil { return } str = r.FormValue("vid") if vid, err = strconv.ParseInt(str, 10, 32); err != nil { log.Errorf("strconv.ParseInt(\"%s\") error(%v)", str, err) err = errors.ErrParam return } keys = r.MultipartForm.Value["keys"] cookies = r.MultipartForm.Value["cookies"] if len(keys) != len(cookies) { log.Errorf("param length not match, keys: %d, cookies: %d", len(keys), len(cookies)) err = errors.ErrParam return } fhs = r.MultipartForm.File["file"] nn = len(fhs) if len(keys) != nn { log.Errorf("param length not match, keys: %d, cookies: %d, files: %d", len(keys), len(cookies), len(fhs)) err = errors.ErrParam return } ns = s.store.Needles(nn) for i, fh = range fhs { if key, err = strconv.ParseInt(keys[i], 10, 64); err != nil { log.Errorf("strconv.ParseInt(\"%s\") error(%v)", keys[i], err) err = errors.ErrParam break } if cookie, err = strconv.ParseInt(cookies[i], 10, 32); err != nil { log.Errorf("strconv.ParseInt(\"%s\") error(%v)", cookies[i], err) err = errors.ErrParam break } if file, err = fh.Open(); err != nil { log.Errorf("fh.Open() error(%v)", err) break } if size, err = checkFileSize(file, s.conf.NeedleMaxSize); err == nil { err = ns.WriteFrom(key, int32(cookie), int32(size), file) } file.Close() if err != nil { break } } if err == nil { if v = s.store.Volumes[int32(vid)]; v != nil { err = v.Writes(ns) } else { err = errors.ErrVolumeNotExist } } s.store.FreeNeedles(nn, ns) return }