package aliyunossservice // //import ( // "bytes" // "encoding/base64" // "fmt" // "go-admin/config" // "io" // "mime/multipart" // "path" // "path/filepath" // "strings" // "sync" // "time" // // "github.com/aliyun/aliyun-oss-go-sdk/oss" // "github.com/google/uuid" //) // //var ( // scheme = "https" // clientPool = sync.Pool{} // once sync.Once //) // //// GetUuidFileName 获取随机文件名 //func GetUuidFileName() string { // return strings.ReplaceAll(uuid.NewString(), "-", "") //} // //func GetDomain() string { // domain := strings.Join([]string{"https://", config.ExtConfig.ALYOssConfig.BucketName, ".", config.ExtConfig.ALYOssConfig.Endpoint}, "") // return domain // //} // //// PublicUpload oss 公开图片文件上传 //func PublicUpload(fileName string, fileByte []byte) (url string, err error) { // // 创建OSSClient实例 // client, err := oss.New(config.ExtConfig.ALYOssConfig.Endpoint, config.ExtConfig.ALYOssConfig.AccessKeyID, config.ExtConfig.ALYOssConfig.AccessKeySecret) // if err != nil { // return url, fmt.Errorf("oss init err: %w", err) // } // // // 获取存储空间 // bucket, err := client.Bucket(config.ExtConfig.ALYOssConfig.BucketName) // if err != nil { // return url, fmt.Errorf("get bucket err: %w", err) // } // // // 上传阿里云路径 // folderName := time.Now().Format("2006-01-02") // if fileName == "" { // fileName = fmt.Sprintf("%v.jpg", GetUuidFileName()) // } // yunFileTmpPath := filepath.Join("uploads", folderName, "coin", fileName) // // windows文件问题 // yunFileTmpPath = strings.ReplaceAll(yunFileTmpPath, "\\", "/") // // // 上传Byte数组 // option := oss.ContentType("image/jpg") // err = bucket.PutObject(yunFileTmpPath, bytes.NewReader(fileByte), option) // if err != nil { // return url, fmt.Errorf("upload file err: %w", err) // } // domain := GetDomain() // return domain + "/" + yunFileTmpPath, nil //} // //// UploadVideoOSS 此方法可以用来上传各种类型的文件 //func UploadVideoOSS(file io.Reader, yunFileTmpPath string) (url string, err error) { // // 创建OSSClient实例 // client, err := oss.New(config.ExtConfig.ALYOssConfig.Endpoint, config.ExtConfig.ALYOssConfig.AccessKeyID, config.ExtConfig.ALYOssConfig.AccessKeySecret) // if err != nil { // return url, fmt.Errorf("oss init err: %w", err) // } // // 获取存储空间 // bucket, err := client.Bucket(config.ExtConfig.ALYOssConfig.BucketName) // if err != nil { // return url, fmt.Errorf("get bucket err: %w", err) // } // //option := oss.ContentType("image/jpg") // 支持 jpg/png // err = bucket.PutObject(yunFileTmpPath, file) // if err != nil { // return url, fmt.Errorf("upload file err: %w", err) // } // domain := GetDomain() // return domain + "/" + yunFileTmpPath, nil // //} // //func PublicUpload1(file io.Reader) (url string, err error) { // // 创建OSSClient实例 // client, err := oss.New(config.ExtConfig.ALYOssConfig.Endpoint, config.ExtConfig.ALYOssConfig.AccessKeyID, config.ExtConfig.ALYOssConfig.AccessKeySecret) // if err != nil { // return url, fmt.Errorf("oss init err: %w", err) // } // // // 获取存储空间 // bucket, err := client.Bucket(config.ExtConfig.ALYOssConfig.BucketName) // if err != nil { // return url, fmt.Errorf("get bucket err: %w", err) // } // // // 上传阿里云路径 // folderName := time.Now().Format("2006-01-02") // yunFileTmpPath := filepath.Join("uploads", folderName, fmt.Sprintf("%v.jpg", GetUuidFileName())) // // windows文件问题 // yunFileTmpPath = strings.ReplaceAll(yunFileTmpPath, "\\", "/") // // // 上传Byte数组 // option := oss.ContentType("image/jpg") // err = bucket.PutObject(yunFileTmpPath, file, option) // if err != nil { // return url, fmt.Errorf("upload file err: %w", err) // } // domain := GetDomain() // return domain + "/" + yunFileTmpPath, nil //} // ////// SecurityUpload 私有图片文件上传 ////// TODO 该方法有问题待修改, 请勿使用 ////func SecurityUpload(fileName string, fileByte []byte) (url string, err error) { //// // 临时访问凭证 //// credentials, err := getSecurityToken() //// if err != nil { //// return url, fmt.Errorf("get security err: %w", err) //// } //// // 创建OSSClient实例 //// client, err := oss.New(config.ExtConfig.ALYOssConfig.Endpoint, credentials.AccessKeyId, credentials.AccessKeySecret, oss.SecurityToken(credentials.SecurityToken)) //// if err != nil { //// return url, fmt.Errorf("create oss virtual client err: %w", err) //// } //// // 获取存储空间 //// bucket, err := client.Bucket(config.ExtConfig.ALYOssConfig.BucketName) //// if err != nil { //// return url, fmt.Errorf("get bucket err: %w", err) //// } //// // 上传阿里云路径 //// folderName := time.Now().Format("2006-01-02") //// yunFileTmpPath := filepath.Join("uploads", folderName, fmt.Sprintf("f%v_%v.jpg", fileName, GetUuidFileName())) //// // windows文件问题 //// yunFileTmpPath = strings.ReplaceAll(yunFileTmpPath, "\\", "/") //// // 带可选参数的签名直传 //// options := []oss.Option{ //// oss.ContentType("image/jpg"), //// } //// err = bucket.PutObject(yunFileTmpPath, bytes.NewReader(fileByte), options...) //// if err != nil { //// return url, fmt.Errorf("upload file err: %w", err) //// } //// signedGetURL, err := bucket.SignURL(yunFileTmpPath, oss.HTTPGet, utility.StringAsInt64(config.ExtConfig.ALYOssConfig.ExpiredInSec)) //// if err != nil { //// return url, fmt.Errorf("get sign url err: %w", err) //// } //// return signedGetURL, nil ////} ////func GetSecurityURL(fileName string) (url string, err error) { //// // 临时访问凭证 //// credentials, err := getSecurityToken() //// if err != nil { //// return url, fmt.Errorf("get security err: %w", err) //// } //// // 创建OSSClient实例 //// client, err := oss.New(config.ExtConfig.ALYOssConfig.Endpoint, credentials.AccessKeyId, credentials.AccessKeySecret, oss.SecurityToken(credentials.SecurityToken)) //// // client, err := oss.New(appconfig.ExtConfig.ALYOssConfig.Endpoint, appconfig.ExtConfig.ALYOssConfig.AccessKeyID, appconfig.ExtConfig.ALYOssConfig.AccessKeySecret, oss.SecurityToken(credentials.SecurityToken)) //// if err != nil { //// return url, fmt.Errorf("create oss virtual client err: %w", err) //// } //// // 获取存储空间 //// bucket, err := client.Bucket(config.ExtConfig.ALYOssConfig.BucketName) //// if err != nil { //// return url, fmt.Errorf("get bucket err: %w", err) //// } //// // 上传阿里云路径 //// folderName := time.Now().Format("2006-01-02") //// yunFileTmpPath := filepath.Join("uploads", folderName, fileName) //// // windows文件问题 //// yunFileTmpPath = strings.ReplaceAll(yunFileTmpPath, "\\", "/") //// // 带可选参数的签名直传 //// fmt.Println("fdfasfsdfasfsdf", yunFileTmpPath) //// signedGetURL, err := bucket.SignURL(yunFileTmpPath, oss.HTTPGet, utility.StringAsInt64(config.ExtConfig.ALYOssConfig.ExpiredInSec)) //// if err != nil { //// return url, fmt.Errorf("get sign url err: %w", err) //// } //// return signedGetURL, nil ////} ////func getSecurityToken() (credentials sts.Credentials, er error) { //// // 构建一个阿里云客户端, 用于发起请求。 //// // 构建阿里云客户端时,需要设置AccessKey ID和AccessKey Secret。 //// client, err := sts.NewClientWithAccessKey(config.ExtConfig.ALYOssConfig.RegionId, config.ExtConfig.ALYOssConfig.AccessKeyID, config.ExtConfig.ALYOssConfig.AccessKeySecret) //// if err != nil { //// return credentials, fmt.Errorf("get credentials err: %w", err) //// } //// // 构建请求对象。 //// request := sts.CreateAssumeRoleRequest() //// // 设置参数。关于参数含义和设置方法,请参见《API参考》。 //// request.Scheme = scheme //// request.RoleArn = config.ExtConfig.ALYOssConfig.RoleArn //// request.RoleSessionName = config.ExtConfig.ALYOssConfig.RoleSessionName //// //// // 发起请求,并得到响应。 //// response, err := client.AssumeRole(request) //// if err != nil { //// loghelper.Error("get assume role err", zap.Error(err)) //// return credentials, fmt.Errorf("get assume role err: %w", err) //// } //// return response.Credentials, nil ////} // //type UploadByBase64 struct { // Images string `json:"images" validate:"required"` // FileName string `json:"fileName"` // 文件名称包含文件类型 //} // //// UploadByString @name 上传文件-字符串 //func UploadByString(params UploadByBase64) (url string, err error) { // // 获取文件名称 // if params.FileName == "" { // // 获取上传文件类型 // fileTypePosition := strings.Index(params.Images, "/") // fileType := params.Images[fileTypePosition+1 : fileTypePosition+5] // uid := uuid.NewString() // params.FileName = uid + "." + fileType // 代码生成图片名称 // } // filePath := fmt.Sprintf("%v/%v", time.Now().Format("2006-01-02"), params.FileName) // uploadPath := filepath.Join("uploads", filePath) // 生成oos图片存储路径 // // // 获取图片内容并base64解密 // fileContentPosition := strings.Index(params.Images, ",") // uploadBaseString := params.Images[fileContentPosition+1:] // uploadString, _ := base64.StdEncoding.DecodeString(uploadBaseString) // // // 创建OSSClient实例 // client, err := oss.New(config.ExtConfig.ALYOssConfig.Endpoint, config.ExtConfig.ALYOssConfig.AccessKeyID, config.ExtConfig.ALYOssConfig.AccessKeySecret) // if err != nil { // return url, fmt.Errorf("create oss client err: %w", err) // } // // // 获取存储空间 // bucket, err := client.Bucket(config.ExtConfig.ALYOssConfig.BucketName) // if err != nil { // return url, fmt.Errorf("get bucket err: %w", err) // } // option := oss.ContentType("image/jpg") // err = bucket.PutObject(uploadPath, strings.NewReader(string(uploadString)), option) // if err != nil { // return url, fmt.Errorf("put object err: %w", err) // } // domain := GetDomain() // return domain + "/" + uploadPath, nil //} // //// 从连接池中获取客户端实例 //func getClient() (*oss.Client, error) { // once.Do(func() { // clientPool.New = func() interface{} { // if config.ExtConfig.ALYOssConfig.Endpoint == `` || config.ExtConfig.ALYOssConfig.AccessKeyID == `` || config.ExtConfig.ALYOssConfig.AccessKeySecret == `` { // return fmt.Errorf("阿里云oss配置错误") // } // client, err := oss.New(config.ExtConfig.ALYOssConfig.Endpoint, config.ExtConfig.ALYOssConfig.AccessKeyID, config.ExtConfig.ALYOssConfig.AccessKeySecret) // if err != nil { // return fmt.Errorf("oss init err: %w", err) // } // return client // } // }) // poolObj := clientPool.Get() // client, ok := poolObj.(*oss.Client) // if !ok { // err, ok := poolObj.(error) // if ok { // return nil, err // } // return nil, fmt.Errorf("getClient err: %v", poolObj) // } // return client, nil //} // //// 将实例放回 //func putClient(x *oss.Client) { // clientPool.Put(x) //} // //// UploadFromFileHeader 通过multipart.FileHeader上传文件 //func UploadFromFileHeader(fileType string, file *multipart.FileHeader) (url string, err error) { // fileReader, err := file.Open() // if err != nil { // return url, err // } // filePath := getPath("uploads/"+fileType, path.Ext(file.Filename)) // // return Upload(fileReader, filePath, oss.ContentType("image/jpg")) //} // //// getPath 通过路径和文件名后缀获取上传阿里云路径 //func getPath(filePath, ext string) (resPath string) { // resPath = path.Join(filePath, time.Now().Format("2006-01-02"), fmt.Sprintf("%v.%s", GetUuidFileName(), ext)) // // windows文件问题 // resPath = strings.ReplaceAll(resPath, "\\", "/") // return resPath //} // //// deUrl 解开url到阿里云路径 用于删除对象 //func deUrl(url string) (resPath string) { // return strings.Replace(url, "https://"+config.ExtConfig.ALYOssConfig.BucketName+"."+config.ExtConfig.ALYOssConfig.Endpoint+"/", ``, 1) //} // //// enUrl 合成url //func enUrl(path string) (resPath string) { // return "https://" + config.ExtConfig.ALYOssConfig.BucketName + "." + config.ExtConfig.ALYOssConfig.Endpoint + "/" + path //} // //// Upload 指定 file文件, path 存储路径 options 配置选项 //func Upload(file io.Reader, path string, options ...oss.Option) (url string, err error) { // // 创建OSSClient实例 // client, err := getClient() // if err != nil { // return url, err // } // defer putClient(client) // // // 获取存储空间 // bucket, err := client.Bucket(config.ExtConfig.ALYOssConfig.BucketName) // if err != nil { // return url, fmt.Errorf("get bucket err: %w", err) // } // // // 上传Byte数组 // err = bucket.PutObject(path, file, options...) // if err != nil { // return url, fmt.Errorf("upload file err: %w", err) // } // url = enUrl(path) // return //} // //// Delete 删除对象 //func Delete(filePath string) (err error) { // // 创建OSSClient实例 // client, err := getClient() // if err != nil { // return err // } // defer putClient(client) // // // 获取存储空间 // bucket, err := client.Bucket(config.ExtConfig.ALYOssConfig.BucketName) // if err != nil { // return fmt.Errorf("get bucket err: %w", err) // } // // // 删除 // err = bucket.DeleteObject(deUrl(filePath)) // if err != nil { // return fmt.Errorf("upload file err: %w", err) // } // return //}