From 7e522785ff2ae69de3efe95bdd8b271870cfa3ab Mon Sep 17 00:00:00 2001 From: momo <1012651275@qq.com> Date: Mon, 20 Nov 2023 14:34:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=98=BF=E9=87=8C=E4=BA=91OS?= =?UTF-8?q?S=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 1 + go.sum | 7 +++ .../internal/logic/uploadfilebackendlogic.go | 2 + server/upload/internal/types/types.go | 2 + server_api/upload.api | 2 + utils/file/upload.go | 56 +++++++++++++++++++ 6 files changed, 70 insertions(+) diff --git a/go.mod b/go.mod index f440ea78..049f0e86 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,7 @@ require ( github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/VictoriaMetrics/metrics v1.18.1 // indirect github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704 // indirect + github.com/aliyun/aliyun-oss-go-sdk v3.0.1+incompatible // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/buger/jsonparser v1.1.1 // indirect diff --git a/go.sum b/go.sum index 25a40f99..ab5ad91d 100644 --- a/go.sum +++ b/go.sum @@ -74,6 +74,8 @@ github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3Uu github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704 h1:PpfENOj/vPfhhy9N2OFRjpue0hjM5XqAp2thFmkXXIk= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU= +github.com/aliyun/aliyun-oss-go-sdk v3.0.1+incompatible h1:so4m5rRA32Tc5GgKg/5gKUu0CRsYmVO3ThMP6T3CwLc= +github.com/aliyun/aliyun-oss-go-sdk v3.0.1+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -85,6 +87,7 @@ github.com/aws/aws-sdk-go v1.44.295 h1:SGjU1+MqttXfRiWHD6WU0DRhaanJgAFY+xIhEaugV github.com/aws/aws-sdk-go v1.44.295/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -186,6 +189,7 @@ github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -347,6 +351,7 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -359,6 +364,7 @@ github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0b github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= @@ -439,6 +445,7 @@ github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOA github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c= github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nacos-group/nacos-sdk-go/v2 v2.2.3 h1:sUQx4f1bXDeeOOEQZjGAitzxYApbYY9fVDbxVCaBW+I= github.com/nacos-group/nacos-sdk-go/v2 v2.2.3/go.mod h1:UL4U89WYdnyajgKJUMpuT1Rr6iNmbjrxOO40JRgtA00= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= diff --git a/server/upload/internal/logic/uploadfilebackendlogic.go b/server/upload/internal/logic/uploadfilebackendlogic.go index 7829103c..4587d643 100644 --- a/server/upload/internal/logic/uploadfilebackendlogic.go +++ b/server/upload/internal/logic/uploadfilebackendlogic.go @@ -106,6 +106,8 @@ func (l *UploadFileBackendLogic) UploadFileBackend(req *types.UploadFileBackendR return resp.SetStatus(basic.CodeFileUploadErr, "upload file failed") } + // 是否备份--异步任务 + // 返回成功的响应和上传URL return resp.SetStatus(basic.CodeOK, map[string]interface{}{ "upload_data": UploadUrl{ diff --git a/server/upload/internal/types/types.go b/server/upload/internal/types/types.go index 2f1b57ed..700fa487 100644 --- a/server/upload/internal/types/types.go +++ b/server/upload/internal/types/types.go @@ -38,6 +38,7 @@ type UploadFileBaseReq struct { Source string `form:"source"` // 上传来源 Refresh int64 `form:"refresh,optional"` // 强制更新 10 ResourceId string `form:"resource_id,optional"` // 资源ID + BackupType string `form:"backup_type,optional"` // 备份资源 } type UploadLogoDebugReq struct { @@ -63,6 +64,7 @@ type UploadFileBackendReq struct { Source string `form:"source"` // 上传来源 Refresh int64 `form:"refresh,optional"` // 强制更新 10 ResourceId string `form:"resource_id,optional"` // 资源ID + BackupType string `form:"backup_type,optional"` // 备份资源 } type UploadFilesReq struct { diff --git a/server_api/upload.api b/server_api/upload.api index 2c842f68..d555ccdd 100644 --- a/server_api/upload.api +++ b/server_api/upload.api @@ -87,6 +87,7 @@ type ( Source string `form:"source"` // 上传来源 Refresh int64 `form:"refresh,optional"` // 强制更新 10 ResourceId string `form:"resource_id,optional"` // 资源ID + BackupType string `form:"backup_type,optional"` // 备份资源 } ) @@ -118,6 +119,7 @@ type ( Source string `form:"source"` // 上传来源 Refresh int64 `form:"refresh,optional"` // 强制更新 10 ResourceId string `form:"resource_id,optional"` // 资源ID + BackupType string `form:"backup_type,optional"` // 备份资源 } UploadFilesReq { diff --git a/utils/file/upload.go b/utils/file/upload.go index 9552d20f..c96c1d1c 100644 --- a/utils/file/upload.go +++ b/utils/file/upload.go @@ -1,12 +1,17 @@ package file import ( + "bufio" + "bytes" "context" "fusenapi/model/gmodel" "fusenapi/utils/basic" + "io" "net/http" + "os" "time" + "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/aws/session" @@ -19,6 +24,16 @@ type Upload struct { Ctx context.Context MysqlConn *gorm.DB AwsSession *session.Session + UploadType string + AliyunOSS AliyunOSS +} +type AliyunOSS struct { + Endpoint string `json:"endpoint"` + AccessKeyId string `json:"access_key_id"` + AccessKeySecret string `json:"access_key_secret"` + BucketName string `json:"bucket_name"` + BucketUrl string `json:"bucket_url"` + BasePath string `json:"base_path"` } type UploadBaseReq struct { @@ -305,3 +320,44 @@ func (upload *Upload) UploadFileByByte(req *UploadBaseReq) (*UploadBaseRes, erro return &uploadBaseRes, err } + +// 根据URL上传文件 +func (upload *Upload) UploadFileByUrl(fileHash string, url string) error { + switch upload.UploadType { + case "oss": + // 创建OSSClient实例。 + client, err := oss.New(upload.AliyunOSS.Endpoint, upload.AliyunOSS.AccessKeyId, upload.AliyunOSS.AccessKeySecret) + if err != nil { + return err + } + bucket, err := client.Bucket(upload.AliyunOSS.BucketName) + if err != nil { + return err + } + // 上传文件。 + file, err := os.Open(url) + if err != nil { + return err + } + defer file.Close() + yunFileTmpPath := upload.AliyunOSS.BasePath + "/" + fileHash + reader := bufio.NewReader(file) + buffer := make([]byte, 4096) + for { + n, err := reader.Read(buffer) + if err != nil { + if err == io.EOF { + break + } + return err + } + err = bucket.PutObject(yunFileTmpPath, bytes.NewReader(buffer[:n])) + if err != nil { + return err + } + } + return nil + default: + return nil + } +}