in oss/lib/cp.go [2057:2130]
func (cc *CopyCommand) uploadFile(bucket *oss.Bucket, destURL CloudURL, file fileInfoType) (skip bool, rerr error, isDir bool, size int64, msg string) {
//first make object name
objectName := cc.makeObjectName(destURL, file)
filePath := file.filePath
filePath = filepath.Join(file.dir, filePath)
skip = false
rerr = nil
isDir = false
size = 0 // the size update to monitor
msg = fmt.Sprintf("%s %s to %s", opUpload, filePath, CloudURLToString(bucket.BucketName, objectName))
//get file size and last modify time
f, err := os.Stat(filePath)
if err != nil {
rerr = err
return
}
if !f.IsDir() {
size = f.Size()
}
srct := f.ModTime().Unix()
absPath, _ := filepath.Abs(filePath)
spath := cc.formatSnapshotKey(absPath, destURL.bucket, objectName)
if skip, rerr = cc.skipUpload(spath, bucket, objectName, destURL, srct); rerr != nil || skip {
return
}
skip = false
if f.IsDir() {
isDir = true
if cc.cpOption.disableDirObject {
skip = true
return
}
rerr = cc.ossPutObjectRetry(bucket, objectName, "")
if err := cc.updateSnapshot(rerr, spath, srct); err != nil {
rerr = err
}
return
}
size = 0
//decide whether to use resume upload
if f.Size() < cc.cpOption.threshold {
var listener *OssProgressListener = &OssProgressListener{&cc.monitor, 0, 0, false}
options := cc.cpOption.options
options = append(options, oss.Progress(listener))
rerr = cc.ossUploadFileRetry(bucket, objectName, filePath, options...)
if err := cc.updateSnapshot(rerr, spath, srct); err != nil {
rerr = err
}
return
}
var listener *OssResumeProgressListener = &OssResumeProgressListener{&cc.monitor, 0, 0, false, false}
//make options for resume multipart upload
//part size
partSize, rt := cc.preparePartOption(f.Size())
LogInfo("multipart upload,file:%s,file size:%d,partSize:%d,routin count:%d\n",
filePath, f.Size(), partSize, rt)
cp := oss.CheckpointDir(true, cc.cpOption.cpDir)
options := cc.cpOption.options
options = append(options, oss.Routines(rt), cp, oss.Progress(listener))
rerr = cc.ossResumeUploadRetry(bucket, objectName, filePath, partSize, options...)
if err := cc.updateSnapshot(rerr, spath, srct); err != nil {
rerr = err
}
return
}