diff --git a/weed-fs/src/cmd/weedclient/weedclient.go b/weed-fs/src/cmd/weedclient/weedclient.go new file mode 100644 index 000000000..266b9ef12 --- /dev/null +++ b/weed-fs/src/cmd/weedclient/weedclient.go @@ -0,0 +1,115 @@ +package main + +import ( + "bytes" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "net/url" + "os" + "pkg/util" + "strconv" +) + +var ( + server = flag.String("server", "localhost:9333", "weedfs master location") + IsDebug = flag.Bool("debug", false, "verbose debug information") +) + +type AssignResult struct { + Fid string "fid" + Url string "url" + PublicUrl string "publicUrl" + Count int `json:",string"` + Error string "error" +} + +func assign(count int) (AssignResult, error) { + values := make(url.Values) + values.Add("count", strconv.Itoa(count)) + jsonBlob := util.Post("http://"+*server+"/dir/assign", values) + var ret AssignResult + err := json.Unmarshal(jsonBlob, &ret) + if err != nil { + return ret, err + } + if ret.Count <= 0 { + return ret, errors.New(ret.Error) + } + return ret, nil +} + +type UploadResult struct { + Size int +} + +func upload(filename string, uploadUrl string) (int, string) { + body_buf := bytes.NewBufferString("") + body_writer := multipart.NewWriter(body_buf) + file_writer, err := body_writer.CreateFormFile("file", filename) + if err != nil { + panic(err.Error()) + } + fh, err := os.Open(filename) + if err != nil { + panic(err.Error()) + } + io.Copy(file_writer, fh) + content_type := body_writer.FormDataContentType() + body_writer.Close() + resp, err := http.Post(uploadUrl, content_type, body_buf) + if err != nil { + panic(err.Error()) + } + defer resp.Body.Close() + resp_body, err := ioutil.ReadAll(resp.Body) + if err != nil { + panic(err.Error()) + } + var ret UploadResult + err = json.Unmarshal(resp_body, &ret) + if err != nil { + panic(err.Error()) + } + //fmt.Println("Uploaded " + strconv.Itoa(ret.Size) + " Bytes to " + uploadUrl) + return ret.Size, uploadUrl +} + +type SubmitResult struct { + Fid string "fid" + Size int "size" +} + +func submit(files []string)([]SubmitResult) { + ret, err := assign(len(files)) + if err != nil { + panic(err) + } + results := make([]SubmitResult, len(files)) + for index, file := range files { + fid := ret.Fid + if index > 0 { + fid = fid + "_" + strconv.Itoa(index) + } + uploadUrl := "http://" + ret.PublicUrl + "/" + fid + results[index].Size, _ = upload(file, uploadUrl) + results[index].Fid = fid + } + return results +} + +func main() { + flag.Parse() + if len(flag.Args()) == 0 { + flag.Usage() + return + } + results := submit(flag.Args()) + bytes, _ := json.Marshal(results) + fmt.Print(string(bytes)) +}