diff --git a/controllers/resource.go b/controllers/resource.go index a7b5079c..e300f0f5 100644 --- a/controllers/resource.go +++ b/controllers/resource.go @@ -180,6 +180,7 @@ func (c *ApiController) UploadResource() { fileType, _ = util.GetOwnerAndNameFromId(mimeType) } + fullFilePath = object.GetTruncatedPath(provider, fullFilePath, 175) if tag != "avatar" && tag != "termsOfUse" { ext := filepath.Ext(filepath.Base(fullFilePath)) index := len(fullFilePath) - len(ext) diff --git a/object/storage.go b/object/storage.go index 6f6c5e1d..c7d60122 100644 --- a/object/storage.go +++ b/object/storage.go @@ -18,6 +18,7 @@ import ( "bytes" "fmt" "net/url" + "path/filepath" "strings" "github.com/casdoor/casdoor/conf" @@ -54,6 +55,25 @@ func escapePath(path string) string { return res } +func GetTruncatedPath(provider *Provider, fullFilePath string, limit int) string { + pathPrefix := util.UrlJoin(util.GetUrlPath(provider.Domain), provider.PathPrefix) + + dir, file := filepath.Split(fullFilePath) + ext := filepath.Ext(file) + fileName := strings.TrimSuffix(file, ext) + for { + escapedString := escapePath(escapePath(fullFilePath)) + if len(escapedString) < limit-len(pathPrefix) { + break + } + rs := []rune(fileName) + fileName = string(rs[0 : len(rs)-1]) + fullFilePath = dir + fileName + ext + } + + return fullFilePath +} + func GetUploadFileUrl(provider *Provider, fullFilePath string, hasTimestamp bool) (string, string) { escapedPath := util.UrlJoin(provider.PathPrefix, escapePath(fullFilePath)) objectKey := util.UrlJoin(util.GetUrlPath(provider.Domain), escapedPath)