aboutsummaryrefslogtreecommitdiff
path: root/go/weed/download.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/weed/download.go')
-rw-r--r--go/weed/download.go94
1 files changed, 61 insertions, 33 deletions
diff --git a/go/weed/download.go b/go/weed/download.go
index 3c55b3a34..392b65edb 100644
--- a/go/weed/download.go
+++ b/go/weed/download.go
@@ -3,9 +3,11 @@ package main
import (
"fmt"
"io"
- "io/ioutil"
"os"
"path"
+
+ "io/ioutil"
+
"strings"
"github.com/chrislusf/seaweedfs/go/operation"
@@ -43,50 +45,76 @@ var cmdDownload = &Command{
func runDownload(cmd *Command, args []string) bool {
for _, fid := range args {
- filename, content, e := fetchFileId(*d.server, fid)
- if e != nil {
- fmt.Println("Fetch Error:", e)
- continue
+ if e := downloadToFile(*d.server, fid, *d.dir); e != nil {
+ fmt.Println("Download Error:", e)
}
- if filename == "" {
- filename = fid
+ }
+ return true
+}
+
+func downloadToFile(server, fileId, saveDir string) error {
+ fileUrl, lookupError := operation.LookupFileId(server, fileId)
+ if lookupError != nil {
+ return lookupError
+ }
+ filename, rc, err := util.DownloadUrl(fileUrl)
+ if err != nil {
+ return err
+ }
+ defer rc.Close()
+ if filename == "" {
+ filename = fileId
+ }
+ isFileList := false
+ if strings.HasSuffix(filename, "-list") {
+ // old command compatible
+ isFileList = true
+ filename = filename[0 : len(filename)-len("-list")]
+ }
+ f, err := os.OpenFile(path.Join(saveDir, filename), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ if isFileList {
+ content, err := ioutil.ReadAll(rc)
+ if err != nil {
+ return err
}
- if strings.HasSuffix(filename, "-list") {
- filename = filename[0 : len(filename)-len("-list")]
- fids := strings.Split(string(content), "\n")
- f, err := os.OpenFile(path.Join(*d.dir, filename), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm)
- if err != nil {
- fmt.Println("File Creation Error:", e)
- continue
+ fids := strings.Split(string(content), "\n")
+ for _, partId := range fids {
+ var n int
+ _, part, err := fetchContent(*d.server, partId)
+ if err == nil {
+ n, err = f.Write(part)
}
- defer f.Close()
- for _, partId := range fids {
- var n int
- _, part, err := fetchFileId(*d.server, partId)
- if err == nil {
- n, err = f.Write(part)
- }
- if err == nil && n < len(part) {
- err = io.ErrShortWrite
- }
- if err != nil {
- fmt.Println("File Write Error:", err)
- break
- }
+ if err == nil && n < len(part) {
+ err = io.ErrShortWrite
}
- } else {
- ioutil.WriteFile(path.Join(*d.dir, filename), content, os.ModePerm)
+ if err != nil {
+ return err
+ }
+ }
+ } else {
+ if _, err = io.Copy(f, rc); err != nil {
+ return err
}
+
}
- return true
+ return nil
}
-func fetchFileId(server string, fileId string) (filename string, content []byte, e error) {
+func fetchContent(server string, fileId string) (filename string, content []byte, e error) {
fileUrl, lookupError := operation.LookupFileId(server, fileId)
if lookupError != nil {
return "", nil, lookupError
}
- filename, content, e = util.DownloadUrl(fileUrl)
+ var rc io.ReadCloser
+ if filename, rc, e = util.DownloadUrl(fileUrl); e != nil {
+ return "", nil, e
+ }
+ content, e = ioutil.ReadAll(rc)
+ rc.Close()
return
}