in oss/lib/append_file.go [187:266]
func (afc *AppendFileCommand) RunCommand() error {
afc.afOption.encodingType, _ = GetString(OptionEncodingType, afc.command.options)
afc.afOption.ossMeta, _ = GetString(OptionMeta, afc.command.options)
srcBucketUrL, err := GetCloudUrl(afc.command.args[1], afc.afOption.encodingType)
if err != nil {
return err
}
if srcBucketUrL.object == "" {
return fmt.Errorf("object key is empty")
}
payer, _ := GetString(OptionRequestPayer, afc.command.options)
if payer != "" {
if payer != strings.ToLower(string(oss.Requester)) {
return fmt.Errorf("invalid request payer: %s, please check", payer)
}
afc.commonOptions = append(afc.commonOptions, oss.RequestPayer(oss.PayerType(payer)))
}
afc.afOption.bucketName = srcBucketUrL.bucket
afc.afOption.objectName = srcBucketUrL.object
// check input file
fileName := afc.command.args[0]
stat, err := os.Stat(fileName)
if err != nil {
return err
}
if stat.IsDir() {
return fmt.Errorf("%s is dir", fileName)
}
if stat.Size() > MaxAppendObjectSize {
return fmt.Errorf("locafile:%s is bigger than %d, it is not supported by append", fileName, MaxAppendObjectSize)
}
afc.afOption.fileName = fileName
afc.afOption.fileSize = stat.Size()
// check object exist or not
client, err := afc.command.ossClient(afc.afOption.bucketName)
if err != nil {
return err
}
bucket, err := client.Bucket(afc.afOption.bucketName)
if err != nil {
return err
}
isExist, err := bucket.IsObjectExist(afc.afOption.objectName, afc.commonOptions...)
if err != nil {
return err
}
if isExist && afc.afOption.ossMeta != "" {
return fmt.Errorf("setting meta on existing append object is not supported")
}
position := int64(0)
if isExist {
//get object size
props, err := bucket.GetObjectMeta(afc.afOption.objectName, afc.commonOptions...)
if err != nil {
return err
}
position, err = strconv.ParseInt(props.Get("Content-Length"), 10, 64)
if err != nil {
return err
}
}
err = afc.AppendFromFile(bucket, position)
return err
}