package services import ( "strings" "server/models" beego "github.com/beego/beego/v2/server/web" ) // PublicRequestBaseURL 根据请求拼出对外访问的根(用于把 /uploads/... 拼成完整下载地址) func PublicRequestBaseURL(c *beego.Controller) (scheme, host string) { scheme = "http" if c.Ctx.Request.TLS != nil { scheme = "https" } if strings.EqualFold(strings.TrimSpace(c.Ctx.Request.Header.Get("X-Forwarded-Proto")), "https") { scheme = "https" } host = strings.TrimSpace(c.Ctx.Request.Host) return scheme, host } // ResolveSoftwareDownloadURL 优先使用自定义 download_url;否则根据 file_id 读附件 src 拼完整 URL func ResolveSoftwareDownloadURL(scheme, host string, downloadURL *string, fileID *uint64) string { if downloadURL != nil { u := strings.TrimSpace(*downloadURL) if u != "" { return u } } if fileID == nil || *fileID == 0 { return "" } var f models.SystemFile err := models.Orm.QueryTable(new(models.SystemFile)). Filter("id", *fileID). Filter("delete_time__isnull", true). One(&f) if err != nil { return "" } src := strings.TrimSpace(f.Src) if src == "" { return "" } if strings.HasPrefix(strings.ToLower(src), "http://") || strings.HasPrefix(strings.ToLower(src), "https://") { return src } if host == "" { return src } if !strings.HasPrefix(src, "/") { src = "/" + src } if scheme == "" { scheme = "http" } return scheme + "://" + host + src }