oss/lib/listpart.go (160 lines of code) (raw):
package lib
import (
"fmt"
"strconv"
oss "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
var specChineseListPart = SpecText{
synopsisText: "列出没有完成分块上传的object的分块信息",
paramText: "oss_object uploadid [options]",
syntaxText: `
ossutil listpart oss://bucket/object uploadid [options]
`,
detailHelpText: `
可以通过ls命令查看bucket的object和uploadid信息,在用本命令查看详细信息
用法:
该命令只有一种用法:
1) ossutil listpart oss://bucket/object uploadid [options]
根据object和uploadid查询块信息
`,
sampleText: `
1) 根据object和uploadid查询块信息
ossutil listpart oss://bucket/object 8A1912289A705A5F0503FCA71DABFD5A
`,
}
var specEnglishListPart = SpecText{
synopsisText: "List parts information of uncompleted multipart object",
paramText: "oss_object uploadid [options]",
syntaxText: `
ossutil listpart oss://bucket/object uploadid [options]
`,
detailHelpText: `
You can use the ls command to view the object and uploadid information of a bucket.
Then Use this command to view detailed part information.
Usages:
There is only one usage for this command:
1) ossutil listpart oss://bucket/object uploadid [options]
Query parts information according to object and uploadid
`,
sampleText: `
1) Query parts information according to object and uploadid
ossutil listpart oss://bucket/object 8A1912289A705A5F0503FCA71DABFD5A
`,
}
type listPartOptionType struct {
cloudUrl CloudURL
uploadId string
encodingType string
}
type ListPartCommand struct {
command Command
lpOption listPartOptionType
}
var listPartCommand = ListPartCommand{
command: Command{
name: "listpart",
nameAlias: []string{"listpart"},
minArgc: 2,
maxArgc: 2,
specChinese: specChineseListPart,
specEnglish: specEnglishListPart,
group: GroupTypeNormalCommand,
validOptionNames: []string{
OptionConfigFile,
OptionEndpoint,
OptionAccessKeyID,
OptionAccessKeySecret,
OptionSTSToken,
OptionProxyHost,
OptionProxyUser,
OptionProxyPwd,
OptionEncodingType,
OptionLogLevel,
OptionPassword,
OptionMode,
OptionECSRoleName,
OptionTokenTimeout,
OptionRamRoleArn,
OptionExternalId,
OptionRoleSessionName,
OptionReadTimeout,
OptionConnectTimeout,
OptionSTSRegion,
OptionSkipVerifyCert,
OptionUserAgent,
OptionSignVersion,
OptionRegion,
OptionCloudBoxID,
OptionForcePathStyle,
},
},
}
// function for FormatHelper interface
func (lpc *ListPartCommand) formatHelpForWhole() string {
return lpc.command.formatHelpForWhole()
}
func (lpc *ListPartCommand) formatIndependHelp() string {
return lpc.command.formatIndependHelp()
}
// Init simulate inheritance, and polymorphism
func (lpc *ListPartCommand) Init(args []string, options OptionMapType) error {
return lpc.command.Init(args, options, lpc)
}
// RunCommand simulate inheritance, and polymorphism
func (lpc *ListPartCommand) RunCommand() error {
lpc.lpOption.encodingType, _ = GetString(OptionEncodingType, lpc.command.options)
srcBucketUrL, err := GetCloudUrl(lpc.command.args[0], lpc.lpOption.encodingType)
if err != nil {
return err
}
if srcBucketUrL.object == "" {
return fmt.Errorf("object name is empty")
}
lpc.lpOption.cloudUrl = *srcBucketUrL
lpc.lpOption.uploadId = lpc.command.args[1]
return lpc.ListPart()
}
func (lpc *ListPartCommand) ListPart() error {
client, err := lpc.command.ossClient(lpc.lpOption.cloudUrl.bucket)
if err != nil {
return err
}
bucket, err := client.Bucket(lpc.lpOption.cloudUrl.bucket)
if err != nil {
return err
}
var imur oss.InitiateMultipartUploadResult
imur.Bucket = lpc.lpOption.cloudUrl.bucket
imur.Key = lpc.lpOption.cloudUrl.object
imur.UploadID = lpc.lpOption.uploadId
partNumberMarker := 0
totalPartCount := 0
var totalPartSize int64 = 0
for i := 0; ; i++ {
lpOptions := []oss.Option{}
lpOptions = append(lpOptions, oss.MaxParts(1000))
lpOptions = append(lpOptions, oss.PartNumberMarker(partNumberMarker))
lpRes, err := bucket.ListUploadedParts(imur, lpOptions...)
if err != nil {
return err
} else {
totalPartCount += len(lpRes.UploadedParts)
if i == 0 && len(lpRes.UploadedParts) > 0 {
fmt.Printf("%-10s\t%-32s\t%-10s\t%s\n", "PartNumber", "Etag", "Size(Byte)", "LastModifyTime")
}
}
for _, v := range lpRes.UploadedParts {
//PartNumber,ETag,Size,LastModified
fmt.Printf("%-10d\t%-32s\t%-10d\t%s\n", v.PartNumber, v.ETag, v.Size, v.LastModified.Format("2006-01-02 15:04:05"))
totalPartSize += int64(v.Size)
}
if lpRes.IsTruncated {
partNumberMarker, err = strconv.Atoi(lpRes.NextPartNumberMarker)
if err != nil {
return err
}
} else {
if totalPartCount > 0 {
fmt.Printf("\ntotal part count:%d\ttotal part size(MB):%.2f\n\n", totalPartCount, float64(totalPartSize/1024)/1024)
}
break
}
}
return nil
}