diff options
Diffstat (limited to 'go/operation/submit.go')
| -rw-r--r-- | go/operation/submit.go | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/go/operation/submit.go b/go/operation/submit.go new file mode 100644 index 000000000..b429ca02a --- /dev/null +++ b/go/operation/submit.go @@ -0,0 +1,91 @@ +package operation + +import ( + "code.google.com/p/weed-fs/go/glog" + "io" + "mime" + "os" + "path" + "path/filepath" + "strconv" + "strings" +) + +type SubmitResult struct { + FileName string `json:"fileName"` + FileUrl string `json:"fileUrl"` + Fid string `json:"fid"` + Size int `json:"size"` + Error string `json:"error"` +} + +func Submit(master string, reader io.Reader, replication string) (result SubmitResult, err error) { + assignResult, assignError := Assign(master, 1, replication) + if assignError != nil { + result.Error = assignError.Error() + return + } + url := "http://" + assignResult.PublicUrl + "/" + assignResult.Fid + uploadResult, uploadError := Upload(url, "", reader, false, "") + if uploadError != nil { + result.Error = uploadError.Error() + return + } + result.Size = uploadResult.Size + result.FileUrl = url + result.Fid = assignResult.Fid + return result, nil +} + +func SubmitFiles(master string, files []string, replication string) ([]SubmitResult, error) { + results := make([]SubmitResult, len(files)) + for index, file := range files { + results[index].FileName = file + } + ret, err := Assign(master, len(files), replication) + if err != nil { + for index, _ := range files { + results[index].Error = err.Error() + } + return results, err + } + for index, file := range files { + fid := ret.Fid + if index > 0 { + fid = fid + "_" + strconv.Itoa(index) + } + results[index].Size, err = upload(file, ret.PublicUrl, fid) + if err != nil { + fid = "" + results[index].Error = err.Error() + } + results[index].Fid = fid + results[index].FileUrl = ret.PublicUrl + "/" + fid + } + return results, nil +} + +func upload(filename string, server string, fid string) (int, error) { + glog.V(2).Info("Start uploading file:", filename) + fh, err := os.Open(filename) + if err != nil { + glog.V(0).Info("Failed to open file: ", filename) + return 0, err + } + fi, fiErr := fh.Stat() + if fiErr != nil { + glog.V(0).Info("Failed to stat file:", filename) + return 0, fiErr + } + filename = path.Base(filename) + isGzipped := path.Ext(filename) == ".gz" + if isGzipped { + filename = filename[0 : len(filename)-3] + } + mtype := mime.TypeByExtension(strings.ToLower(filepath.Ext(filename))) + ret, e := Upload("http://"+server+"/"+fid+"?ts="+strconv.Itoa(int(fi.ModTime().Unix())), filename, fh, isGzipped, mtype) + if e != nil { + return 0, e + } + return ret.Size, e +} |
