diff options
Diffstat (limited to 'go/cmd/upload.go')
| -rw-r--r-- | go/cmd/upload.go | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/go/cmd/upload.go b/go/cmd/upload.go new file mode 100644 index 000000000..0260c9c87 --- /dev/null +++ b/go/cmd/upload.go @@ -0,0 +1,113 @@ +package main + +import ( + "encoding/json" + "errors" + "fmt" + "net/url" + "os" + "path" + "code.google.com/p/weed-fs/go/operation" + "code.google.com/p/weed-fs/go/util" + "strconv" +) + +var uploadReplication *string + +func init() { + cmdUpload.Run = runUpload // break init cycle + cmdUpload.IsDebug = cmdUpload.Flag.Bool("debug", false, "verbose debug information") + server = cmdUpload.Flag.String("server", "localhost:9333", "weedfs master location") + uploadReplication = cmdUpload.Flag.String("replication", "000", "replication type(000,001,010,100,110,200)") +} + +var cmdUpload = &Command{ + UsageLine: "upload -server=localhost:9333 file1 [file2 file3]", + Short: "upload one or a list of files", + Long: `upload one or a list of files. + It uses consecutive file keys for the list of files. + e.g. If the file1 uses key k, file2 can be read via k_1 + + `, +} + +type AssignResult struct { + Fid string "fid" + Url string "url" + PublicUrl string "publicUrl" + Count int + Error string "error" +} + +func assign(count int) (*AssignResult, error) { + values := make(url.Values) + values.Add("count", strconv.Itoa(count)) + values.Add("replication", *uploadReplication) + jsonBlob, err := util.Post("http://"+*server+"/dir/assign", values) + debug("assign result :", string(jsonBlob)) + if err != nil { + return nil, err + } + var ret AssignResult + err = json.Unmarshal(jsonBlob, &ret) + if err != nil { + return nil, err + } + if ret.Count <= 0 { + return nil, errors.New(ret.Error) + } + return &ret, nil +} + +func upload(filename string, server string, fid string) (int, error) { + debug("Start uploading file:", filename) + fh, err := os.Open(filename) + if err != nil { + debug("Failed to open file:", filename) + return 0, err + } + ret, e := operation.Upload("http://"+server+"/"+fid, path.Base(filename), fh) + if e != nil { + return 0, e + } + return ret.Size, e +} + +type SubmitResult struct { + Fid string "fid" + Size int "size" + Error string "error" +} + +func submit(files []string) []SubmitResult { + ret, err := assign(len(files)) + if err != nil { + fmt.Println(err) + return nil + } + results := make([]SubmitResult, len(files)) + 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 + } + return results +} + +func runUpload(cmd *Command, args []string) bool { + *IsDebug = true + if len(cmdUpload.Flag.Args()) == 0 { + return false + } + results := submit(args) + bytes, _ := json.Marshal(results) + fmt.Print(string(bytes)) + return true +} |
