| @@ -490,6 +490,9 @@ var ( | |||||
| Index string | Index string | ||||
| TimeField string | TimeField string | ||||
| ElkTimeFormat string | ElkTimeFormat string | ||||
| //nginx proxy | |||||
| PROXYURL string | |||||
| ) | ) | ||||
| // DateLang transforms standard language locale name to corresponding value in datetime plugin. | // DateLang transforms standard language locale name to corresponding value in datetime plugin. | ||||
| @@ -1196,6 +1199,7 @@ func NewContext() { | |||||
| Location = sec.Key("LOCATION").MustString("cn-south-222") | Location = sec.Key("LOCATION").MustString("cn-south-222") | ||||
| BasePath = sec.Key("BASE_PATH").MustString("attachment/") | BasePath = sec.Key("BASE_PATH").MustString("attachment/") | ||||
| UserBasePath = sec.Key("BASE_PATH_USER").MustString("users/") | UserBasePath = sec.Key("BASE_PATH_USER").MustString("users/") | ||||
| PROXYURL = sec.Key("PROXY_URL").MustString("") | |||||
| sec = Cfg.Section("modelarts") | sec = Cfg.Section("modelarts") | ||||
| ModelArtsHost = sec.Key("ENDPOINT").MustString("112.95.163.80") | ModelArtsHost = sec.Key("ENDPOINT").MustString("112.95.163.80") | ||||
| @@ -1217,6 +1221,7 @@ func NewContext() { | |||||
| Index = sec.Key("INDEX").MustString("filebeat-7.3.2*") | Index = sec.Key("INDEX").MustString("filebeat-7.3.2*") | ||||
| TimeField = sec.Key("TIMEFIELD").MustString(" @timestamptest") | TimeField = sec.Key("TIMEFIELD").MustString(" @timestamptest") | ||||
| ElkTimeFormat = sec.Key("ELKTIMEFORMAT").MustString("date_time") | ElkTimeFormat = sec.Key("ELKTIMEFORMAT").MustString("date_time") | ||||
| } | } | ||||
| func loadInternalToken(sec *ini.Section) string { | func loadInternalToken(sec *ini.Section) string { | ||||
| @@ -5,11 +5,13 @@ | |||||
| package storage | package storage | ||||
| import ( | import ( | ||||
| "github.com/unknwon/com" | |||||
| "io" | |||||
| "path" | "path" | ||||
| "strconv" | "strconv" | ||||
| "strings" | "strings" | ||||
| "github.com/unknwon/com" | |||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| "code.gitea.io/gitea/modules/obs" | "code.gitea.io/gitea/modules/obs" | ||||
| "code.gitea.io/gitea/modules/setting" | "code.gitea.io/gitea/modules/setting" | ||||
| @@ -102,6 +104,31 @@ func CompleteObsMultiPartUpload(uuid, uploadID, fileName string) error { | |||||
| return nil | return nil | ||||
| } | } | ||||
| func ObsMultiPartUpload(uuid string, uploadId string, partNumber int, fileName string, putBody io.ReadCloser) error { | |||||
| input := &obs.UploadPartInput{} | |||||
| input.Bucket = setting.Bucket | |||||
| input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, fileName)), "/") | |||||
| input.UploadId = uploadId | |||||
| input.PartNumber = partNumber | |||||
| input.Body = putBody | |||||
| output, err := ObsCli.UploadPart(input) | |||||
| if err == nil { | |||||
| log.Info("RequestId:%s\n", output.RequestId) | |||||
| log.Info("ETag:%s\n", output.ETag) | |||||
| return nil | |||||
| } else { | |||||
| if obsError, ok := err.(obs.ObsError); ok { | |||||
| log.Info(obsError.Code) | |||||
| log.Info(obsError.Message) | |||||
| return obsError | |||||
| } else { | |||||
| log.Error("error:", err) | |||||
| return err | |||||
| } | |||||
| } | |||||
| } | |||||
| func ObsGenMultiPartSignedUrl(uuid string, uploadId string, partNumber int, fileName string) (string, error) { | func ObsGenMultiPartSignedUrl(uuid string, uploadId string, partNumber int, fileName string) (string, error) { | ||||
| input := &obs.CreateSignedUrlInput{} | input := &obs.CreateSignedUrlInput{} | ||||
| @@ -662,6 +662,24 @@ func NewMultipart(ctx *context.Context) { | |||||
| } | } | ||||
| } | } | ||||
| func PutOBSProxyUpload(ctx *context.Context) { | |||||
| uuid := ctx.Query("uuid") | |||||
| uploadID := ctx.Query("uploadId") | |||||
| partNumber := ctx.QueryInt("partNumber") | |||||
| fileName := ctx.Query("file_name") | |||||
| RequestBody := ctx.Req.Body() | |||||
| if RequestBody == nil { | |||||
| ctx.Error(500, fmt.Sprintf("FormFile: %v", RequestBody)) | |||||
| return | |||||
| } | |||||
| err := storage.ObsMultiPartUpload(uuid, uploadID, partNumber, fileName, RequestBody.ReadCloser()) | |||||
| if err != nil { | |||||
| log.Info("upload error.") | |||||
| } | |||||
| } | |||||
| func GetMultipartUploadUrl(ctx *context.Context) { | func GetMultipartUploadUrl(ctx *context.Context) { | ||||
| uuid := ctx.Query("uuid") | uuid := ctx.Query("uuid") | ||||
| uploadID := ctx.Query("uploadID") | uploadID := ctx.Query("uploadID") | ||||
| @@ -689,14 +707,17 @@ func GetMultipartUploadUrl(ctx *context.Context) { | |||||
| return | return | ||||
| } | } | ||||
| } else { | } else { | ||||
| url, err = storage.ObsGenMultiPartSignedUrl(uuid, uploadID, partNumber, fileName) | |||||
| if err != nil { | |||||
| ctx.Error(500, fmt.Sprintf("ObsGenMultiPartSignedUrl failed: %v", err)) | |||||
| return | |||||
| if setting.PROXYURL != "" { | |||||
| url = setting.PROXYURL + "?uuid=" + uuid + "&uploadId=" + uploadID + "&partNumber=" + fmt.Sprint(partNumber) + "&file_name=" + fileName | |||||
| log.Info("return url=" + url) | |||||
| } else { | |||||
| url, err = storage.ObsGenMultiPartSignedUrl(uuid, uploadID, partNumber, fileName) | |||||
| if err != nil { | |||||
| ctx.Error(500, fmt.Sprintf("ObsGenMultiPartSignedUrl failed: %v", err)) | |||||
| return | |||||
| } | |||||
| log.Info("url=" + url) | |||||
| } | } | ||||
| log.Info("url=" + url) | |||||
| } | } | ||||
| ctx.JSON(200, map[string]string{ | ctx.JSON(200, map[string]string{ | ||||
| @@ -6,13 +6,14 @@ package routes | |||||
| import ( | import ( | ||||
| "bytes" | "bytes" | ||||
| "code.gitea.io/gitea/routers/operation" | |||||
| "encoding/gob" | "encoding/gob" | ||||
| "net/http" | "net/http" | ||||
| "path" | "path" | ||||
| "text/template" | "text/template" | ||||
| "time" | "time" | ||||
| "code.gitea.io/gitea/routers/operation" | |||||
| "code.gitea.io/gitea/routers/secure" | "code.gitea.io/gitea/routers/secure" | ||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| @@ -565,6 +566,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| m.Post("/private", repo.UpdatePublicAttachment) | m.Post("/private", repo.UpdatePublicAttachment) | ||||
| m.Get("/get_chunks", repo.GetSuccessChunks) | m.Get("/get_chunks", repo.GetSuccessChunks) | ||||
| m.Get("/new_multipart", repo.NewMultipart) | m.Get("/new_multipart", repo.NewMultipart) | ||||
| m.Get("/obs_proxy_multipart", repo.PutOBSProxyUpload) | |||||
| m.Get("/get_multipart_url", repo.GetMultipartUploadUrl) | m.Get("/get_multipart_url", repo.GetMultipartUploadUrl) | ||||
| m.Post("/complete_multipart", repo.CompleteMultipart) | m.Post("/complete_multipart", repo.CompleteMultipart) | ||||
| m.Post("/update_chunk", repo.UpdateMultipart) | m.Post("/update_chunk", repo.UpdateMultipart) | ||||