diff --git a/README.md b/README.md index 8236f09..c454179 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ func (up *UpYun) Mkdir(path string) error #### 上传 ```go -func (up *UpYun) Put(config *PutObjectConfig) (err error) +func (up *UpYun) Put(config *PutObjectConfig) (fInfo *FileInfo, err error) ``` #### 下载 diff --git a/upyun/fileinfo.go b/upyun/fileinfo.go index f7a7eae..429d57b 100644 --- a/upyun/fileinfo.go +++ b/upyun/fileinfo.go @@ -2,6 +2,7 @@ package upyun import ( "net/http" + "path" "strings" "time" ) @@ -32,8 +33,10 @@ type FileInfo struct { x-upyun-width: 500 x-upyun-frames: 90 */ -func parseHeaderToFileInfo(header http.Header, getinfo bool) *FileInfo { - fInfo := &FileInfo{} +func parseHeaderToFileInfo(name string, header http.Header, getinfo bool) *FileInfo { + fInfo := &FileInfo{ + Name: path.Join("/", name), + } for k, v := range header { lk := strings.ToLower(k) if strings.HasPrefix(lk, "x-upyun-meta-") { diff --git a/upyun/rest.go b/upyun/rest.go index fbfef42..c2be8be 100644 --- a/upyun/rest.go +++ b/upyun/rest.go @@ -138,8 +138,7 @@ func (up *UpYun) Get(config *GetObjectConfig) (fInfo *FileInfo, err error) { } defer resp.Body.Close() - fInfo = parseHeaderToFileInfo(resp.Header, false) - fInfo.Name = config.Path + fInfo = parseHeaderToFileInfo(config.Path, resp.Header, false) if fInfo.Size, err = io.Copy(config.Writer, resp.Body); err != nil { return nil, fmt.Errorf("io copy: %v", err) @@ -148,7 +147,7 @@ func (up *UpYun) Get(config *GetObjectConfig) (fInfo *FileInfo, err error) { return } -func (up *UpYun) put(config *PutObjectConfig) error { +func (up *UpYun) put(config *PutObjectConfig) (*FileInfo, error) { /* Append Api Deprecated if config.AppendContent { if config.Headers == nil { @@ -157,7 +156,8 @@ func (up *UpYun) put(config *PutObjectConfig) error { config.Headers["X-Upyun-Append"] = "true" } */ - _, err := up.doRESTRequest(&restReqConfig{ + + resp, err := up.doRESTRequest(&restReqConfig{ method: "PUT", uri: config.Path, headers: config.Headers, @@ -166,21 +166,22 @@ func (up *UpYun) put(config *PutObjectConfig) error { useMD5: config.UseMD5, }) if err != nil { - return fmt.Errorf("doRESTRequest: %v", err) + return nil, fmt.Errorf("doRESTRequest: %v", err) } - return nil + + return parseHeaderToFileInfo(config.Path, resp.Header, false), nil } // TODO: progress -func (up *UpYun) resumePut(config *PutObjectConfig) error { +func (up *UpYun) resumePut(config *PutObjectConfig) (*FileInfo, error) { f, ok := config.Reader.(*os.File) if !ok { - return fmt.Errorf("resumePut: type != *os.File") + return nil, fmt.Errorf("resumePut: type != *os.File") } fileinfo, err := f.Stat() if err != nil { - return fmt.Errorf("Stat: %v", err) + return nil, fmt.Errorf("Stat: %v", err) } fsize := fileinfo.Size() @@ -223,7 +224,7 @@ func (up *UpYun) resumePut(config *PutObjectConfig) error { fragFile, err := newFragmentFile(f, curSize, partSize) if err != nil { - return fmt.Errorf("newFragmentFile: %v", err) + return nil, fmt.Errorf("newFragmentFile: %v", err) } try := 0 @@ -241,34 +242,37 @@ func (up *UpYun) resumePut(config *PutObjectConfig) error { break } if _, ok := err.(net.Error); !ok { - return fmt.Errorf("doRESTRequest: %v", err) + return nil, fmt.Errorf("doRESTRequest: %v", err) } fragFile.Seek(0, 0) } if config.MaxResumePutTries > 0 && try == config.MaxResumePutTries { - return err + return nil, err } if id == 0 { headers["X-Upyun-Multi-UUID"] = resp.Header.Get("X-Upyun-Multi-UUID") } else { if id == maxPartID { - return nil + if resp != nil { + return parseHeaderToFileInfo(config.Path, resp.Header, false), nil + } + return nil, nil } } curSize += partSize } - return nil + return nil, nil } -func (up *UpYun) Put(config *PutObjectConfig) (err error) { +func (up *UpYun) Put(config *PutObjectConfig) (fInfo *FileInfo, err error) { if config.LocalPath != "" { var fd *os.File if fd, err = os.Open(config.LocalPath); err != nil { - return fmt.Errorf("open file: %v", err) + return nil, fmt.Errorf("open file: %v", err) } defer fd.Close() config.Reader = fd @@ -314,8 +318,7 @@ func (up *UpYun) GetInfo(path string) (*FileInfo, error) { } return nil, fmt.Errorf("getinfo %s: %v", path, err) } - fInfo := parseHeaderToFileInfo(resp.Header, true) - fInfo.Name = path + fInfo := parseHeaderToFileInfo(path, resp.Header, true) return fInfo, nil } diff --git a/upyun/rest_test.go b/upyun/rest_test.go index 4979620..8c87937 100644 --- a/upyun/rest_test.go +++ b/upyun/rest_test.go @@ -53,7 +53,7 @@ func TestPutWithFileReader(t *testing.T) { NotNil(t, fd) defer fd.Close() - err := up.Put(&PutObjectConfig{ + _, err := up.Put(&PutObjectConfig{ Path: REST_FILE_1, Reader: fd, Headers: map[string]string{ @@ -68,7 +68,7 @@ func TestPutWithBuffer(t *testing.T) { s := BUF_CONTENT r := strings.NewReader(s) - err := up.Put(&PutObjectConfig{ + _, err := up.Put(&PutObjectConfig{ Path: REST_FILE_BUF, Reader: r, Headers: map[string]string{ @@ -114,7 +114,7 @@ func TestResumePut(t *testing.T) { defer os.RemoveAll(fname) - err := up.Put(&PutObjectConfig{ + _, err := up.Put(&PutObjectConfig{ Path: REST_FILE_1M, LocalPath: fname, UseMD5: true,