| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- package main
- import (
- "context"
- "encoding/json"
- "fmt"
- "net/http"
- "net/url"
- "os"
- "strconv"
- "strings"
- "time"
- "github.com/tencentyun/cos-go-sdk-v5"
- "github.com/tencentyun/cos-go-sdk-v5/debug"
- )
- type Config struct {
- SecretID string
- SecretKey string
- Region string
- Bucket string
- }
- func log_status(err error) {
- if err == nil {
- return
- }
- if cos.IsNotFoundError(err) {
- // WARN
- fmt.Println("WARN: Resource is not existed")
- } else if e, ok := cos.IsCOSError(err); ok {
- fmt.Printf("ERROR: Code: %v\n", e.Code)
- fmt.Printf("ERROR: Message: %v\n", e.Message)
- fmt.Printf("ERROR: Resource: %v\n", e.Resource)
- fmt.Printf("ERROR: RequestId: %v\n", e.RequestID)
- // ERROR
- } else {
- fmt.Printf("ERROR: %v\n", err)
- // ERROR
- }
- }
- func main() {
- // 解析配置
- fileptr, err := os.Open("config.json")
- if err != nil {
- fmt.Printf("Failed to open config file:%s", err.Error())
- return
- }
- defer fileptr.Close()
- var config Config
- decoder := json.NewDecoder(fileptr)
- err = decoder.Decode(&config)
- if err != nil {
- fmt.Println("Decoder json failed", err.Error())
- return
- } else {
- fmt.Printf("Region:%s, Bucket:%s\n", config.Region, config.Bucket)
- }
- var cosurl string
- cosurl = "http://" + config.Bucket + ".cos." + config.Region + ".myqcloud.com"
- u, _ := url.Parse(cosurl)
- b := &cos.BaseURL{BucketURL: u}
- c := cos.NewClient(b, &http.Client{
- Transport: &cos.AuthorizationTransport{
- SecretID: config.SecretID,
- SecretKey: config.SecretKey,
- Transport: &debug.DebugRequestTransport{
- RequestHeader: false,
- // Notice when put a large file and set need the request body, might happend out of memory error.
- RequestBody: false,
- ResponseHeader: false,
- ResponseBody: false,
- },
- },
- })
- testSizeArray := [...]int{1024 * 1024, 4 * 1024 * 1024}
- testTimes := 10
- var totalComsumeTime int
- var speed, avgSpeed float32
- for _, size := range testSizeArray {
- sizeInMb := size / (1024 * 1024)
- fmt.Printf("============test upload %dMB file===============\n", sizeInMb)
- testStr := strings.Repeat("t", size)
- testFilenamePrefix := "testfile" + strconv.Itoa(sizeInMb) + "MB-"
- i := 0
- for i < testTimes {
- startTime := time.Now().UnixNano() / 1e6
- testKey := testFilenamePrefix + strconv.Itoa(i)
- testReader := strings.NewReader(testStr)
- resp, err := c.Object.Put(context.Background(), testKey, testReader, nil)
- if err != nil {
- fmt.Printf("upload failed")
- log_status(err)
- } else {
- endTime := time.Now().UnixNano() / 1e6
- consumeTimeMs := endTime - startTime
- totalComsumeTime += int(consumeTimeMs)
- speed = (float32)(sizeInMb) / ((float32)(consumeTimeMs) / 1000)
- fmt.Printf("succeed to upload %s, requestId: %s, httpCode: %s, consumeTime: %dms, speed: %0.2f MB/s\n",
- testKey, resp.Header.Get("x-cos-request-id"), resp.Status, consumeTimeMs, speed)
-
- // 删除对象
- //_, err := c.Object.Delete(context.Background(), testKey)
- //if err != nil {
- // fmt.Printf("failed to delete %s", testKey)
- //}
- i++
- }
- }
- avgSpeed = (float32)(sizeInMb*testTimes) / ((float32)(totalComsumeTime) / 1000)
- totalComsumeTime = 0
- fmt.Printf("\naverage upload speed %0.2f MB/s\n", avgSpeed)
- }
-
- for _, size := range testSizeArray {
- sizeInMb := size / (1024 * 1024)
- fmt.Printf("============test download %dMB file===============\n", sizeInMb)
- testFilenamePrefix := "testfile" + strconv.Itoa(sizeInMb) + "MB-"
- i := 0
- for i < testTimes {
- startTime := time.Now().UnixNano() / 1e6
- testKey := testFilenamePrefix + strconv.Itoa(i)
- resp, err := c.Object.GetToFile(context.Background(), testKey, testKey, nil)
- if err != nil {
- fmt.Printf("download failed")
- log_status(err)
- } else {
- endTime := time.Now().UnixNano() / 1e6
- consumeTimeMs := endTime - startTime
- totalComsumeTime += int(consumeTimeMs)
- speed = (float32)(sizeInMb) / ((float32)(consumeTimeMs) / 1000)
- fmt.Printf("succeed to download %s, requestId: %s, httpCode: %s, consumeTime: %dms, speed: %0.2f MB/s\n",
- testKey, resp.Header.Get("x-cos-request-id"), resp.Status, consumeTimeMs, speed)
-
- // 删除对象
- _, err := c.Object.Delete(context.Background(), testKey)
- if err != nil {
- fmt.Printf("failed to delete %s", testKey)
- }
- // 删除本地文件
- os.Remove(testKey)
-
- i++
- }
- }
- avgSpeed = (float32)(sizeInMb*testTimes) / ((float32)(totalComsumeTime) / 1000)
- totalComsumeTime = 0
- fmt.Printf("\naverage download speed %0.2f MB/s\n", avgSpeed)
- }
- fmt.Scanln()
- }
|