Api.Upload supports single file uploads

using mimetype command
matching prefixes regardless of slashes
This commit is contained in:
zsfelfoldi 2015-06-02 13:15:43 +02:00
parent 017af45af5
commit 69e7333e25
2 changed files with 52 additions and 28 deletions

View file

@ -160,22 +160,31 @@ const maxParallelFiles = 5
// TODO: localpath should point to a manifest // TODO: localpath should point to a manifest
func (self *Api) Upload(lpath string) (string, error) { func (self *Api) Upload(lpath string) (string, error) {
var list []*manifestTrieEntry var list []*manifestTrieEntry
localpath, err1 := filepath.Abs(filepath.Clean(lpath)) localpath, err := filepath.Abs(filepath.Clean(lpath))
if err1 != nil { if err != nil {
return "", err1 return "", err
} }
start := len(localpath)
if (start > 0) && (localpath[start-1] != os.PathSeparator) { f, err := os.Open(localpath)
start++ if err != nil {
return "", err
} }
stat, err := f.Stat()
if err != nil {
return "", err
}
var start int
if stat.IsDir() {
start = len(localpath)
dpaLogger.Debugf("uploading '%s'", localpath) dpaLogger.Debugf("uploading '%s'", localpath)
err := filepath.Walk(localpath, func(path string, info os.FileInfo, err error) error { err = filepath.Walk(localpath, func(path string, info os.FileInfo, err error) error {
if (err == nil) && !info.IsDir() { if (err == nil) && !info.IsDir() {
//fmt.Printf("lp %s path %s\n", localpath, path) //fmt.Printf("lp %s path %s\n", localpath, path)
if len(path) <= start { if len(path) <= start {
return fmt.Errorf("Path is too short") return fmt.Errorf("Path is too short")
} }
if path[:len(localpath)] != localpath { if path[:start] != localpath {
return fmt.Errorf("Path prefix of '%s' does not match localpath '%s'", path, localpath) return fmt.Errorf("Path prefix of '%s' does not match localpath '%s'", path, localpath)
} }
entry := &manifestTrieEntry{ entry := &manifestTrieEntry{
@ -188,6 +197,20 @@ func (self *Api) Upload(lpath string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
} else {
dir := filepath.Dir(localpath)
start = len(dir)
if len(localpath) <= start {
return "", fmt.Errorf("Path is too short")
}
if localpath[:start] != dir {
return "", fmt.Errorf("Path prefix of '%s' does not match dir '%s'", localpath, dir)
}
entry := &manifestTrieEntry{
Path: localpath,
}
list = append(list, entry)
}
cnt := len(list) cnt := len(list)
errors := make([]error, cnt) errors := make([]error, cnt)
@ -213,7 +236,8 @@ func (self *Api) Upload(lpath string) (string, error) {
wg.Wait() wg.Wait()
} }
if err == nil { if err == nil {
cmd := exec.Command("file", "--mime-type", "-b", entry.Path) //cmd := exec.Command("file", "--mime-type", "-b", entry.Path)
cmd := exec.Command("mimetype", "-b", entry.Path)
var out bytes.Buffer var out bytes.Buffer
cmd.Stdout = &out cmd.Stdout = &out
err = cmd.Run() err = cmd.Run()

View file

@ -262,8 +262,8 @@ func (self *manifestTrie) getEntry(spath string) (entry *manifestTrieEntry, full
path := regularSlashes(spath) path := regularSlashes(spath)
var pos int var pos int
entry, pos = self.findPrefixOf(path) entry, pos = self.findPrefixOf(path)
if (pos > 0) && (pos < len(path)) && (path[pos] != '/') { /*if (pos > 0) && (pos < len(path)) && (path[pos] != '/') {
return nil, "" return nil, ""
} }*/
return entry, path[:pos] return entry, path[:pos]
} }