作者 yangfu

修改 阿里云媒体迁移

@@ -4,6 +4,7 @@ go 1.12 @@ -4,6 +4,7 @@ go 1.12
4 4
5 require ( 5 require (
6 github.com/aliyun/alibaba-cloud-sdk-go v1.60.348 6 github.com/aliyun/alibaba-cloud-sdk-go v1.60.348
  7 + github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible
7 github.com/astaxie/beego v1.10.0 8 github.com/astaxie/beego v1.10.0
8 github.com/disintegration/imaging v1.6.2 9 github.com/disintegration/imaging v1.6.2
9 github.com/gin-gonic/gin v1.4.0 10 github.com/gin-gonic/gin v1.4.0
1 package aliyun 1 package aliyun
2 2
3 import ( 3 import (
  4 + "github.com/aliyun/aliyun-oss-go-sdk/oss"
4 "github.com/astaxie/beego" 5 "github.com/astaxie/beego"
  6 + "io"
5 ) 7 )
6 8
7 /* 9 /*
@@ -16,11 +18,58 @@ var ( @@ -16,11 +18,58 @@ var (
16 //EndpointCdn string = beego.AppConfig.String("end_point_cdn") 18 //EndpointCdn string = beego.AppConfig.String("end_point_cdn")
17 ) 19 )
18 20
19 -//type OssSts struct{  
20 -//  
21 -//} 21 +type OSSClient struct {
  22 + client *oss.Client
  23 + UpAddr UploadAddress
  24 + Auth UploadAuth
  25 +}
22 26
23 -//func NewSTS(){  
24 -// client,_ :=oos.NewClientWithAccessKey(RegionID,AccessKeyID,AccessKeySecret)  
25 -// client.DoAction()  
26 -//} 27 +//新建oss-client对象
  28 +func NewStsOSSClient(uploadAddress, uploadAuth string) (o *OSSClient, err error) {
  29 + addr, e := ParseUploadAddress(uploadAddress)
  30 + if e != nil {
  31 + err = e
  32 + return
  33 + }
  34 + auth, e := ParseUploadAuth(uploadAuth)
  35 + if e != nil {
  36 + err = e
  37 + return
  38 + }
  39 + o, err = NewOSSClient(addr.Endpoint, auth.AccessKeyId, auth.AccessKeySecret, auth.SecurityToken)
  40 + if err != nil {
  41 + return
  42 + }
  43 + o.UpAddr = addr
  44 + o.Auth = auth
  45 + return
  46 +}
  47 +func NewOSSClient(ep, key, secret, token string) (o *OSSClient, err error) {
  48 + o = &OSSClient{}
  49 + o.client, err = oss.New(ep, key, secret, oss.SecurityToken(token))
  50 + if err != nil {
  51 + return
  52 + }
  53 + return
  54 +}
  55 +
  56 +//简单上传 (通过文件地址)
  57 +func (o *OSSClient) PutObjectByUrl(bucketName string, fileName string, url string) error {
  58 + r, err := GetFileFromUrl(url)
  59 + if err != nil {
  60 + return err
  61 + }
  62 + return o.PutObject(bucketName, fileName, r)
  63 +}
  64 +func (o *OSSClient) PutObjectByUrlDefault(url string) error {
  65 + return o.PutObjectByUrl(o.UpAddr.Bucket, o.UpAddr.FileName, url)
  66 +}
  67 +
  68 +//简单上传
  69 +func (o *OSSClient) PutObject(bucketName, objKey string, r io.Reader, options ...oss.Option) error {
  70 + bucket, err := o.client.Bucket(bucketName)
  71 + if err != nil {
  72 + return err
  73 + }
  74 + return bucket.PutObject(objKey, r, options...)
  75 +}
1 package aliyun 1 package aliyun
2 2
3 import ( 3 import (
  4 + "bufio"
  5 + "bytes"
4 "encoding/base64" 6 "encoding/base64"
5 "encoding/json" 7 "encoding/json"
6 "fmt" 8 "fmt"
  9 + "io"
  10 + "net/http"
7 "strings" 11 "strings"
8 ) 12 )
9 13
@@ -13,6 +17,14 @@ type UploadAddress struct { @@ -13,6 +17,14 @@ type UploadAddress struct {
13 FileName string 17 FileName string
14 } 18 }
15 19
  20 +type UploadAuth struct {
  21 + SecurityToken string //sts
  22 + AccessKeyId string
  23 + AccessKeySecret string
  24 + Expiration string
  25 + Region string
  26 +}
  27 +
16 //@cname 绑定域名 28 //@cname 绑定域名
17 func (up UploadAddress) GetFileUrl(cname string) string { 29 func (up UploadAddress) GetFileUrl(cname string) string {
18 if len(cname) > 0 { 30 if len(cname) > 0 {
@@ -38,3 +50,36 @@ func ParseUploadAddress(uploadAddress string) (up UploadAddress, err error) { @@ -38,3 +50,36 @@ func ParseUploadAddress(uploadAddress string) (up UploadAddress, err error) {
38 } 50 }
39 return 51 return
40 } 52 }
  53 +
  54 +//解析UploadAddress
  55 +func ParseUploadAuth(uploadAuth string) (up UploadAuth, err error) {
  56 + var jsData []byte
  57 + jsData, err = base64.StdEncoding.DecodeString(uploadAuth)
  58 + if err != nil {
  59 + return
  60 + }
  61 + if err = json.Unmarshal(jsData, &up); err != nil {
  62 + return
  63 + }
  64 + return
  65 +}
  66 +
  67 +//从文件地址下载数据
  68 +func GetFileFromUrl(url string) (r io.Reader, err error) {
  69 + if !strings.Contains(url, "http") {
  70 + return nil, fmt.Errorf("异常路径:%v", url)
  71 + }
  72 + //下载
  73 + rsp, err := http.Get(strings.TrimSpace(url))
  74 + if err != nil {
  75 + return
  76 + }
  77 + var buf *bytes.Buffer = bytes.NewBuffer(nil)
  78 + buf.ReadFrom(rsp.Body)
  79 + r = bufio.NewReader(buf)
  80 + defer rsp.Body.Close()
  81 + if err != nil {
  82 + return
  83 + }
  84 + return
  85 +}
  1 +package aliyun
  2 +
  3 +import (
  4 + "bytes"
  5 + "testing"
  6 +)
  7 +
  8 +func Test_GetFile(t *testing.T) {
  9 + io, err := GetFileFromUrl("http://mmm-opp-dev.fjmaimaimai.com/file/opp/image/20200106/1578297295_RxJscRHCzQmxeseTAEQXTH7A7ZK6z4Fz.jpg")
  10 + if err != nil {
  11 + t.Log(err)
  12 + return
  13 + }
  14 + var buf bytes.Buffer
  15 + n, _ := buf.ReadFrom(io)
  16 + t.Log("read from reader:", n)
  17 +}
@@ -544,7 +544,7 @@ type Picture struct { @@ -544,7 +544,7 @@ type Picture struct {
544 H int `json:"h"` 544 H int `json:"h"`
545 ImageId string `json:"imageId"` //imageId 545 ImageId string `json:"imageId"` //imageId
546 PathBak string `json:"path_bak"` 546 PathBak string `json:"path_bak"`
547 - JobId string `json:"job_id"` 547 + //JobId string `json:"job_id"`
548 } 548 }
549 549
550 //视频 550 //视频
@@ -2,12 +2,14 @@ package contrab @@ -2,12 +2,14 @@ package contrab
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "github.com/aliyun/alibaba-cloud-sdk-go/services/vod"
5 "github.com/astaxie/beego/orm" 6 "github.com/astaxie/beego/orm"
6 "gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log" 7 "gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log"
7 "opp/internal/aliyun" 8 "opp/internal/aliyun"
8 "opp/internal/utils" 9 "opp/internal/utils"
9 "opp/models" 10 "opp/models"
10 "opp/protocol" 11 "opp/protocol"
  12 + "path/filepath"
11 ) 13 )
12 14
13 const LoopSize = 1 15 const LoopSize = 1
@@ -71,18 +73,47 @@ func uploadImages(d *models.ChanceData, img string) (rsp []protocol.Picture) { @@ -71,18 +73,47 @@ func uploadImages(d *models.ChanceData, img string) (rsp []protocol.Picture) {
71 printInfo(d, p.Path, Uploaded) 73 printInfo(d, p.Path, Uploaded)
72 continue 74 continue
73 } 75 }
74 - //上传图片  
75 - callBack := aliyun.NewCallBackHttp(getCallBackUrl())  
76 - extend := NewChanceDataExtend(d, aliyun.FileImage, p.Path)  
77 - response, err := aliyun.UploadMediaByURL([]string{p.Path}, callBack, extend)  
78 - if err != nil || response == nil || len(response.UploadJobs) == 0 {  
79 - printInfo(d, p.Path, UploadFail)  
80 - continue 76 +
  77 + var (
  78 + err error
  79 + vodc *vod.Client
  80 + imageRsp *aliyun.CreateUploadImageResponse
  81 + client *aliyun.OSSClient
  82 + )
  83 + vodc, _ = aliyun.DefaultVodClient()
  84 + list := filepath.SplitList(p.Path)
  85 + if len(list) == 0 {
  86 + err = fmt.Errorf("路径无效:%v", p.Path)
  87 + goto ERR
  88 + }
  89 + if err != nil {
  90 + goto ERR
  91 + }
  92 + imageRsp, err = aliyun.CreateUploadImage(vodc, &aliyun.CreateUploadImageRequest{FileName: list[len(list)-1]})
  93 + if err != nil {
  94 + goto ERR
81 } 95 }
  96 + client, err = aliyun.NewStsOSSClient(imageRsp.UploadAddress, imageRsp.UploadAuth)
  97 + if err != nil {
  98 + goto ERR
  99 + }
  100 + err = client.PutObjectByUrlDefault(p.Path)
  101 + if err != nil {
  102 + goto ERR
  103 + }
  104 +
82 //备份路径 105 //备份路径
83 rsp[i].PathBak = p.Path 106 rsp[i].PathBak = p.Path
84 - rsp[i].JobId = response.UploadJobs[0].JobId 107 + rsp[i].ImageId = imageRsp.ImageId
  108 + rsp[i].Path = imageRsp.ImageURL
85 printInfo(d, p.Path, UploadSuccess) 109 printInfo(d, p.Path, UploadSuccess)
  110 + continue
  111 + ERR:
  112 + {
  113 + log.Error("ali vod error:", err)
  114 + printInfo(d, p.Path, UploadFail)
  115 + continue
  116 + }
86 } 117 }
87 return 118 return
88 } 119 }