作者 yangfu

修改:1.推送类型

增加:1.oss文件上传 2.sts授权
... ... @@ -9,6 +9,9 @@ AccessKeyID ="LTAI4FhiZ3UktC6N1u3H5GFC"
AccessKeySecret ="UyspWwdni55CYQ02hUCint4qY2jNYO"
cname ="https://media.goexample.live/"
OssEndPoint ="oss-cn-shanghai.aliyuncs.com"
BuckName ="mmm-vod-dev-public"
#友盟推送
UMENG_API_HOST = "http://msg.umeng.com"
... ...
... ... @@ -5,6 +5,7 @@ go 1.12
require (
github.com/ajg/form v1.5.1 // indirect
github.com/aliyun/alibaba-cloud-sdk-go v1.60.348
github.com/aliyun/aliyun-oss-go-sdk v2.1.4+incompatible
github.com/aliyun/aliyun-sts-go-sdk v0.0.0-20171106034748-98d3903a2309
github.com/astaxie/beego v1.10.0
github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect
... ...
package oss
import (
"bytes"
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"io/ioutil"
"mime/multipart"
"openapi/pkg/constant"
protocol "openapi/pkg/domain"
"openapi/pkg/infrastructure/aliyun"
"openapi/pkg/infrastructure/log"
"openapi/pkg/infrastructure/utils"
"path/filepath"
)
type BuckObject struct {
DefaultHost string `json:"host"`
Key string `json:"key"`
Path string `json:"path"`
FileName string `json:"fileName"`
}
//创建视频上传凭证
func CreateOssUpload(header *protocol.RequestHeader, MultipartForm *multipart.Form) (rsp interface{}, err error) {
var objects []aliyun.Object
var listPath []BuckObject
var bucket *oss.Bucket
bucket, err = aliyun.DefaultBucket()
if err != nil {
log.Error(err.Error())
return
}
for k, _ := range MultipartForm.File {
v := MultipartForm.File[k]
for i := range v {
if v[i].Size > 1024*1024*50 {
continue
}
f, _ := v[i].Open()
data, _ := ioutil.ReadAll(f)
f.Close()
reader := bytes.NewBuffer(data)
fileBase := filepath.Base(v[i].Filename)
key := utils.GetFileName(header.AppProject, aliyun.FileObject, fileBase)
objects = append(objects, aliyun.Object{
Key: key,
Value: reader,
})
listPath = append(listPath, BuckObject{
DefaultHost: fmt.Sprintf("https://%v.%v", constant.BuckName, constant.OssEndPoint),
Path: fmt.Sprintf("https://%v.%v/%v", constant.BuckName, constant.OssEndPoint, key),
Key: key,
FileName: fileBase,
})
}
}
if len(objects) == 0 {
return
}
err = aliyun.CreateObjects(bucket, objects...)
if err != nil {
log.Error(err.Error())
return
}
rsp = listPath
return
}
//创建视频上传凭证
func CreateStsAuth(header *protocol.RequestHeader, files []string) (rsp interface{}, err error) {
access, e := aliyun.DefaultSts()
if e != nil {
err = e
log.Error(e.Error())
}
var listPath []BuckObject
for _, v := range files {
fileBase := filepath.Base(v)
key := utils.GetFileName(header.AppProject, aliyun.FileObject, fileBase)
listPath = append(listPath, BuckObject{
DefaultHost: fmt.Sprintf("https://%v.%v", constant.BuckName, constant.OssEndPoint),
Path: fmt.Sprintf("https://%v.%v/%v", constant.BuckName, constant.OssEndPoint, key),
Key: key,
FileName: fileBase,
})
}
return map[string]interface{}{"access": access, "files": listPath}, nil
}
... ...
package constant
var (
OssEndPoint = "oss-cn-shanghai.aliyuncs.com"
BuckName = "mmm-vod-dev-public"
//OssAccessKeyID string = "LTAI4GGkZMdDoxRpehefbQhV"
//OssAccessKeySecret string = "tytXo0RwxhGa3luyfmBB6PKe8M6Uu4"
)
func init() {
OssEndPoint = config.StringDefault("OssEndPoint", OssEndPoint)
BuckName = config.StringDefault("BuckName", BuckName)
//OssAccessKeyID = config.StringDefault("AccessKeyID", OssAccessKeyID)
//OssAccessKeySecret = config.StringDefault("OssAccessKeyID", OssAccessKeySecret)
}
... ...
... ... @@ -7,9 +7,10 @@ var (
)
const (
FileImage = "image"
FileVoice = "voice"
FileVideo = "video"
FileImage = "image"
FileVoice = "voice"
FileVideo = "video"
FileObject = "object"
)
const (
... ...
package aliyun
import (
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"io"
"openapi/pkg/constant"
)
/*
AK AccessKey 完全访问权限
STS (Security Token Service) 临时访问控制
... ... @@ -12,3 +18,46 @@ type ossConfig struct {
BuckName string
CallbackUrl string
}
func DefaultBucket() (*oss.Bucket, error) {
client, err := oss.New(constant.OssEndPoint, constant.AccessKeyID, constant.AccessKeySecret)
if err != nil {
return nil, err
}
// Get bucket
bucket, err := client.Bucket(constant.BuckName)
if err != nil {
return nil, err
}
return bucket, nil
}
type Object struct {
Key string
Value io.Reader
}
// CreateObjects creates some objects
func CreateObjects(bucket *oss.Bucket, objects ...Object) error {
for _, object := range objects {
err := bucket.PutObject(object.Key, object.Value)
if err != nil {
return err
}
}
return nil
}
// DeleteObjects deletes some objects.
// object = key
func DeleteObjects(bucket *oss.Bucket, objects ...string) error {
for _, object := range objects {
err := bucket.DeleteObject(object)
if err != nil {
return err
}
}
return nil
}
... ...
package aliyun
import (
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/services/sts"
"openapi/pkg/constant"
"openapi/pkg/infrastructure/log"
)
func DefaultSts() (interface{}, error) {
//构建一个阿里云客户端, 用于发起请求。
//构建阿里云客户端时,需要设置AccessKey ID和AccessKey Secret。
client, err := sts.NewClientWithAccessKey(constant.RegionID, constant.AccessKeyID, constant.AccessKeySecret)
if err != nil {
return nil, err
}
//构建请求对象。
request := sts.CreateAssumeRoleRequest()
request.Scheme = "https"
//设置参数。 指定角色的ARN。格式:acs:ram::$accountID:role/$roleName/$RoleSessionName 。 mmm-go@1373671070046453.onaliyun.com
// 配置用户 - ram角色权限-oss授权
// $accountID 用户的阿里云账号
// $RoleArn 点到ram角色 具体的权限详情 格式 格式:acs:ram::$accountID:role/$roleName/$RoleSessionName
request.RoleArn = fmt.Sprintf("acs:ram::1373671070046453:role/role-oss-sts")
// 会话名称
request.RoleSessionName = "role-oss-sts-session"
//发起请求,并得到响应。
response, e := client.AssumeRole(request)
if e != nil {
err = e
log.Error(e.Error())
}
return map[string]interface{}{
"accessKeySecret": response.Credentials.AccessKeySecret,
"expiration": response.Credentials.Expiration,
"accessKeyId": response.Credentials.AccessKeyId,
"securityToken": response.Credentials.SecurityToken,
}, nil
}
... ...
... ... @@ -165,7 +165,7 @@ func NewAps(options *push.Options) (v *Aps) {
v = &Aps{
Alert: NewAlert(options),
AutoBadge: "+1",
ContentAvailable: 1,
ContentAvailable: 0,
}
return
}
... ...
... ... @@ -3,6 +3,7 @@ package v1
import (
"encoding/json"
"gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log"
oss "openapi/pkg/application/oss/service"
vod "openapi/pkg/application/vod/service"
"openapi/pkg/domain"
"openapi/pkg/infrastructure/aliyun"
... ... @@ -197,3 +198,32 @@ func (this *VodController) GetVideoPlayAuth() {
header := controllers.GetRequestHeader(this.Ctx)
msg = domain.NewReturnResponse(vod.GetVideoPlayAuth(header, request))
}
//归档对象 PutObject
// @router /putObject [post]
func (this *VodController) PutObject() {
var msg *domain.ResponseMessage
defer func() {
this.Resp(msg)
}()
header := controllers.GetRequestHeader(this.Ctx)
msg = domain.NewReturnResponse(oss.CreateOssUpload(header, this.Ctx.Request.MultipartForm))
}
// STS授权 CreateStsAuth
// @router /createStsAuth [post]
func (this *VodController) CreateStsAuth() {
var msg *domain.ResponseMessage
defer func() {
this.Resp(msg)
}()
var request []string
if err := json.Unmarshal(this.ByteBody, &request); err != nil {
log.Error(err)
msg = domain.BadRequestParam(1)
return
}
header := controllers.GetRequestHeader(this.Ctx)
msg = domain.NewReturnResponse(oss.CreateStsAuth(header, request))
}
... ...
... ... @@ -86,5 +86,18 @@ func init() {
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Params: nil})
beego.GlobalControllerRouter["openapi/pkg/port/beego/controllers/v1:VodController"] = append(beego.GlobalControllerRouter["openapi/pkg/port/beego/controllers/v1:VodController"],
beego.ControllerComments{
Method: "PutObject",
Router: `/putObject`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Params: nil})
beego.GlobalControllerRouter["openapi/pkg/port/beego/controllers/v1:VodController"] = append(beego.GlobalControllerRouter["openapi/pkg/port/beego/controllers/v1:VodController"],
beego.ControllerComments{
Method: "CreateStsAuth",
Router: `/createStsAuth`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Params: nil})
}
... ...