获取图标支持下载到服务器上

This commit is contained in:
Sun
2024-01-29 23:22:01 +08:00
parent 66d0e5e94c
commit 04a512f94a
2 changed files with 162 additions and 5 deletions
+71 -4
View File
@@ -2,13 +2,20 @@ package panel
import (
"encoding/json"
"fmt"
"net/url"
"os"
"path"
"strings"
"sun-panel/api/api_v1/common/apiData/commonApiStructs"
"sun-panel/api/api_v1/common/apiData/panelApiStructs"
"sun-panel/api/api_v1/common/apiReturn"
"sun-panel/api/api_v1/common/base"
"sun-panel/global"
"sun-panel/lib/cmn"
"sun-panel/lib/siteFavicon"
"sun-panel/models"
"time"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
@@ -188,7 +195,9 @@ func (a *ItemIcon) SaveSort(c *gin.Context) {
apiReturn.Success(c)
}
// 支持获取并直接下载对方网站图标到服务器
func (a *ItemIcon) GetSiteFavicon(c *gin.Context) {
userInfo, _ := base.GetCurrentUserInfo(c)
req := panelApiStructs.ItemIconGetSiteFaviconReq{}
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
@@ -196,10 +205,68 @@ func (a *ItemIcon) GetSiteFavicon(c *gin.Context) {
return
}
resp := panelApiStructs.ItemIconGetSiteFaviconResp{}
if iconUrl, ok := siteFavicon.GetOneFaviconURL(req.Url); ok {
resp.IconUrl = iconUrl
apiReturn.SuccessData(c, resp)
fullUrl := ""
if iconUrl, err := siteFavicon.GetOneFaviconURL(req.Url); err != nil {
apiReturn.Error(c, "acquisition failed: get ico error:"+err.Error())
return
} else {
fullUrl = iconUrl
}
parsedURL, err := url.Parse(req.Url)
if err != nil {
apiReturn.Error(c, "acquisition failed:"+err.Error())
return
}
apiReturn.Error(c, "acquisition failed")
protocol := parsedURL.Scheme
global.Logger.Debug("protocol:", protocol)
global.Logger.Debug("fullUrl:", fullUrl)
// 如果URL以双斜杠(//)开头,则使用当前页面协议
if strings.HasPrefix(fullUrl, "//") {
fullUrl = protocol + "://" + fullUrl[2:]
} else if !strings.HasPrefix(fullUrl, "http://") && !strings.HasPrefix(fullUrl, "https://") {
// 如果URL既不以http://开头也不以https://开头,则默认为http协议
fullUrl = "http://" + fullUrl
}
global.Logger.Debug("fullUrl:", fullUrl)
// 去除图标的get参数
{
parsedIcoURL, err := url.Parse(fullUrl)
if err != nil {
apiReturn.Error(c, "acquisition failed: parsed ico URL :"+err.Error())
return
}
fullUrl = parsedIcoURL.Scheme + "://" + parsedIcoURL.Host + parsedIcoURL.Path
}
global.Logger.Debug("fullUrl:", fullUrl)
// 生成保存目录
configUpload := global.Config.GetValueString("base", "source_path")
savePath := fmt.Sprintf("%s/%d/%d/%d/", configUpload, time.Now().Year(), time.Now().Month(), time.Now().Day())
isExist, _ := cmn.PathExists(savePath)
if !isExist {
os.MkdirAll(savePath, os.ModePerm)
}
// 下载
var imgInfo *os.File
{
var err error
if imgInfo, err = siteFavicon.DownloadImage(fullUrl, savePath, 1024*1024); err != nil {
apiReturn.Error(c, "acquisition failed: download"+err.Error())
return
}
}
// 保存到数据库
ext := path.Ext(fullUrl)
mFile := models.File{}
if _, err := mFile.AddFile(userInfo.ID, parsedURL.Host, ext, imgInfo.Name()); err != nil {
apiReturn.ErrorDatabase(c, err.Error())
return
}
resp.IconUrl = imgInfo.Name()[1:]
apiReturn.SuccessData(c, resp)
}