in oss/lib/cp.go [2490:2551]
func (cc *CopyCommand) downloadSingleFile(bucket *oss.Bucket, objectInfo objectInfoType, filePath string) (bool, error, int64, string) {
//get object size and last modify time
object := objectInfo.prefix + objectInfo.relativeKey
size := objectInfo.size
srct := objectInfo.lastModified
//make file name
fileName := cc.makeFileName(objectInfo.relativeKey, filePath)
msg := fmt.Sprintf("%s %s to %s", opDownload, CloudURLToString(bucket.BucketName, object), fileName)
if size < 0 {
statOptions := cc.cpOption.payerOptions
if cc.cpOption.versionId != "" {
statOptions = append(statOptions, oss.VersionId(cc.cpOption.versionId))
}
props, err := cc.command.ossGetObjectStatRetry(bucket, object, statOptions...)
if err != nil {
return false, err, size, msg
}
size, err = strconv.ParseInt(props.Get(oss.HTTPHeaderContentLength), 10, 64)
if err != nil {
return false, err, size, msg
}
if srct, err = time.Parse(http.TimeFormat, props.Get(oss.HTTPHeaderLastModified)); err != nil {
return false, err, size, msg
}
}
rsize := cc.getRangeSize(size)
if cc.skipDownload(fileName, srct, CloudURLToString(bucket.BucketName, object)) {
return true, nil, rsize, msg
}
if size == 0 && strings.HasSuffix(object, "/") {
return false, os.MkdirAll(fileName, 0755), rsize, msg
}
//create parent directory
if err := cc.createParentDirectory(fileName); err != nil {
return false, err, rsize, msg
}
downloadOptions := cc.cpOption.options
if cc.cpOption.vrange != "" {
downloadOptions = append(downloadOptions, oss.NormalizedRange(cc.cpOption.vrange))
}
if rsize < cc.cpOption.threshold {
var listener *OssProgressListener = &OssProgressListener{&cc.monitor, 0, 0, false}
downloadOptions = append(downloadOptions, oss.Progress(listener))
return false, cc.ossDownloadFileRetry(bucket, object, fileName, downloadOptions...), 0, msg
}
var listener *OssResumeProgressListener = &OssResumeProgressListener{&cc.monitor, 0, 0, false, false}
downloadOptions = append(downloadOptions, oss.Progress(listener))
partSize, rt := cc.preparePartOption(size)
cp := oss.CheckpointDir(true, cc.cpOption.cpDir)
LogInfo("multipart download,object %s,file size:%d,partSize %d,routin count:%d,checkpoint dir:%s\n",
object, size, partSize, rt, cc.cpOption.cpDir)
downloadOptions = append(downloadOptions, oss.Routines(rt), cp)
return false, cc.ossResumeDownloadRetry(bucket, object, fileName, size, partSize, downloadOptions...), 0, msg
}