|
- // Copyright 2020 The Gitea Authors. All rights reserved.
- // Use of this source code is governed by a MIT-style
- // license that can be found in the LICENSE file.
-
- package storage
-
- import (
- "io"
- "path"
- "strconv"
- "strings"
-
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/obs"
- "code.gitea.io/gitea/modules/setting"
- )
-
- //check if has the object
- //todo:修改查询方式
- func ObsHasObject(path string) (bool, error) {
- hasObject := false
- output, err := ObsCli.ListObjects(&obs.ListObjectsInput{Bucket:setting.Bucket})
- if err != nil {
- log.Error("ListObjects failed:%v", err)
- return hasObject, err
- }
-
- for _, obj := range output.Contents {
- //obj.Key:attachment/0/1/019fd24e-4ef7-41cc-9f85-4a7b8504d958
- if path == obj.Key {
- hasObject = true
- break
- }
- }
-
- return hasObject, nil
- }
-
- func GetObsPartInfos(uuid string, uploadID string) (string, error) {
- key := strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, uuid)), "/")
-
- output, err := ObsCli.ListParts(&obs.ListPartsInput{
- Bucket: setting.Bucket,
- Key: key,
- UploadId: uploadID,
- })
- if err != nil {
- log.Error("ListParts failed:", err.Error())
- return "", err
- }
-
- var chunks string
- for _, partInfo := range output.Parts {
- chunks += strconv.Itoa(partInfo.PartNumber) + "-" + partInfo.ETag + ","
- }
-
- return chunks, nil
- }
-
- func NewObsMultiPartUpload(uuid string) (string, error) {
- input := &obs.InitiateMultipartUploadInput{}
- input.Bucket = setting.Bucket
- input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, uuid)), "/")
-
- output, err := ObsCli.InitiateMultipartUpload(input)
- if err != nil {
- log.Error("InitiateMultipartUpload failed:", err.Error())
- return "", err
- }
-
- return output.UploadId, nil
- }
-
- func CompleteObsMultiPartUpload(uuid string, uploadID string) error {
- input := &obs.CompleteMultipartUploadInput{}
- input.Bucket = setting.Bucket
- input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, uuid)), "/")
- input.UploadId = uploadID
- output, err := ObsCli.ListParts(&obs.ListPartsInput{
- Bucket: setting.Bucket,
- Key: input.Key,
- UploadId: uploadID,
- })
- if err != nil {
- log.Error("ListParts failed:", err.Error())
- return err
- }
-
- for _, partInfo := range output.Parts {
- input.Parts = append(input.Parts, obs.Part{
- PartNumber: partInfo.PartNumber,
- ETag: partInfo.ETag,
- })
- }
-
- _, err = ObsCli.CompleteMultipartUpload(input)
- if err != nil {
- log.Error("CompleteMultipartUpload failed:", err.Error())
- return err
- }
-
- return nil
- }
-
- func ObsUploadPart(uuid string, uploadId string, partNumber int, partSize int64, body io.Reader) (string, error) {
- input := &obs.UploadPartInput{}
- input.PartNumber = partNumber
- input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, uuid)), "/")
- input.UploadId = uploadId
- input.Bucket = setting.Bucket
- input.PartSize = partSize
- input.Body = body
- output, err := ObsCli.UploadPart(input)
- if err != nil {
- log.Error("UploadPart failed:", err.Error())
- return "", err
- }
-
- return output.ETag, nil
- }
-
- func ObsGenMultiPartSignedUrl(uuid string, uploadId string, partNumber int, partSize int64) (string, error) {
- /*
- input := &obs.CreateSignedUrlInput{}
- input.Bucket = setting.Bucket
- input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid)), "/")
- input.Expires = int(PresignedUploadPartUrlExpireTime)
- input.Method = obs.HTTP_PUT
-
- input.QueryParams = map[string]string{
- "Bucket": input.Bucket,
- "Key": input.Key,
- "PartNumber": com.ToStr(partNumber,10),
- "UploadId": uploadId,
- "PartSize": com.ToStr(partSize,10),
- }
-
- input.Headers = map[string]string{
-
- }
-
- */
-
- Key := strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, uuid)), "/")
- req, err := ObsCli.CreateUploadPartSignedUrl(setting.Bucket, Key, uploadId, partNumber, partSize)
- if err != nil {
- log.Error("CreateSignedUrl failed:", err.Error())
- return "", err
- }
-
- log.Info(req.URL.String())
- log.Info("", req.Header)
-
- return req.URL.String(), nil
-
- }
-
- func ObsGetPreSignedUrl(uuid, fileName string) (string, error) {
- input := &obs.CreateSignedUrlInput{}
- input.Method = obs.HttpMethodGet
- input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, uuid)), "/")
- input.Bucket = setting.Bucket
- input.Expires = 60 * 60
-
- reqParams := make(map[string]string)
- reqParams["response-content-disposition"] = "attachment; filename=\"" + fileName + "\""
- input.QueryParams = reqParams
- output, err := ObsCli.CreateSignedUrl(input)
- if err != nil {
- log.Error("CreateSignedUrl failed:", err.Error())
- return "", err
- }
-
- return output.SignedUrl, nil
- }
|