package entity import ( "crypto/sha256" "fmt" "io" "net/url" "os" "path/filepath" "app.yhyue.com/moapp/jybase/common" "github.com/zeromicro/go-zero/core/logx" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) var Ossclient *oss.Client func OssInit(ossEndpoint, ossAccessKeyID, ossAccessKeySecret string) { client, err := oss.New(ossEndpoint, ossAccessKeyID, ossAccessKeySecret) if err != nil { logx.Error("Error:", err) os.Exit(-1) } Ossclient = client } // OssPutObject oss附件上传 func OssPutObject(objectName string, fd io.Reader, ossBucketName string) (bool, error) { defer common.Catch() // 获取存储空间。 bucket, err := Ossclient.Bucket(ossBucketName) if err != nil { logx.Error("Error:", err) return false, err } fileNameOnly := getFileNameOnly(objectName) fileExtension := TypeByExt(objectName) option := []oss.Option{ // oss.ContentDisposition("attachment;filename=" + objectName), oss.ContentDisposition("attachment;filename=" + url.QueryEscape(fileNameOnly) + "." + fileExtension + ";filename*=UTF-8''" + url.QueryEscape(fileNameOnly) + "." + fileExtension), oss.ContentType("application/octet-stream"), oss.ACReqHeaders("Access-Control-Allow-Origin"), oss.ACReqMethod("*"), } // 上传文件流。 文件超过1M 上传时间超时(发现是受控制台日志打印影响,现已把日志单独处理,注释协程) err = bucket.PutObject(objectName, fd, option...) if err != nil { logx.Error("file upload false:", err) return false, err } return true, nil } //删除附件 func OssDelObject(objectName, ossBucketName string) (bool, error) { defer common.Catch() // 获取存储信息 bucket, err := Ossclient.Bucket(ossBucketName) if err != nil { logx.Error("Error:", err) return false, err } //附件是否存在 存在再删除 if ok, _ := bucket.IsObjectExist(objectName); !ok { err = bucket.DeleteObject(objectName) if err != nil { logx.Error("file del false:", err) return false, err } } return true, err } func GetHashKey(bs []byte) string { defer common.Catch() ha := sha256.New() ha.Write(bs) hbs := ha.Sum(nil) key := fmt.Sprintf("%x", hbs) return key } func TypeByExt(path string) string { for i := len(path) - 1; i >= 0 && path[i] != '/'; i-- { if path[i] == '.' { return path[i:] } } return "" } // 获取文件名称(不带后缀) func getFileNameOnly(filename string) string { extension := filepath.Ext(filename) fileNameOnly := filename[0 : len(filename)-len(extension)] return fileNameOnly }