From 7799298282f15708a1de0a214c1edcb725fab673 Mon Sep 17 00:00:00 2001 From: satori Date: Tue, 31 Dec 2024 06:57:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=88=B0data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/graphql.go | 2 +- bin/main.go | 24 ++++++++++++++++++++++++ models/image.go | 27 ++++++--------------------- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/api/graphql.go b/api/graphql.go index 61a0710..e19bfe3 100644 --- a/api/graphql.go +++ b/api/graphql.go @@ -64,7 +64,7 @@ func CheckColorNullRows(offset int) { continue } // 打开图像文件 - filepath := "oss/" + matches[1] + filepath := "data/oss/" + matches[1] file, err := os.Open(filepath) if err != nil { fmt.Println("打开文件失败", index, item.ID, item.Content, err) diff --git a/bin/main.go b/bin/main.go index 16eb7cc..b53ff97 100644 --- a/bin/main.go +++ b/bin/main.go @@ -7,6 +7,8 @@ import ( "log" "net/http" "net/url" + "os" + "path/filepath" "runtime" "strings" "time" @@ -520,6 +522,13 @@ func main() { http.HandleFunc("/webp/", func(w http.ResponseWriter, r *http.Request) { defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志 + // 如果本地文件存在,直接输出 + filePath := filepath.Join("data/webp", r.URL.Path) + if _, err := os.Stat(filePath); err != nil { + http.ServeFile(w, r, filePath) + return + } + reg := regexp.MustCompile(`^/webp/([0-9a-zA-Z]+)-([0-9a-zA-Z]+)-([0-9a-zA-Z]+)-([0-9]+)-([0-9]+)-([a-zA-Z]+).(jpg|jpeg|png|webp)$`) matches := reg.FindStringSubmatch(r.URL.Path) if len(matches) != 8 { @@ -547,6 +556,21 @@ func main() { return } + // 将生成的 WebP 文件保存到本地 + err = os.MkdirAll(filepath.Dir(filePath), os.ModePerm) + if err != nil { + log.Println("创建文件目录失败:", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + err = os.WriteFile(filePath, data, 0644) + if err != nil { + log.Println("保存文件失败:", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + // 返回 WebP 图片数据 w.Header().Set("Content-Type", "image/webp") w.Header().Set("Cache-Control", "max-age=31536000") w.Write(data) diff --git a/models/image.go b/models/image.go index 8901ea4..0bfc05f 100644 --- a/models/image.go +++ b/models/image.go @@ -27,32 +27,17 @@ func (img *Image) Init(content string) error { if len(regexp.MustCompile(`image.gameuiux.cn`).FindStringSubmatch(content)) > 0 { key := regexp.MustCompile(`^https?://image.gameuiux.cn/`).ReplaceAllString(content, "") - filePath := filepath.Join("oss", key) + filePath := filepath.Join("data/oss", key) - // 先检查本地是否存在原图, 没有则从oss下载 + // 先检查本地是否存在原图, 没有则从OSS下载 if _, err := os.Stat(filePath); err != nil { - - ensureDirExists := func(filePath string) error { - dir := filepath.Dir(filePath) // 获取文件所在的目录 - if _, err := os.Stat(dir); os.IsNotExist(err) { - // 如果目录不存在,创建多级目录 - if err := os.MkdirAll(dir, 0755); err != nil { - return err - } - } - return nil + if err := os.MkdirAll(filepath.Dir(filePath), 0755); err != nil { + log.Fatalf("创建目录失败: %v\n", err) } - - // 确保目录存在 - if err := ensureDirExists(filePath); err != nil { - log.Fatalf("Failed to create directory: %v\n", err) - } - bucket := GetBucket("gameui-image2") fmt.Println("从 OSS 下载:", key, filePath) - err = bucket.GetObjectToFile(key, filePath) - if err != nil { - log.Println("Failed to download file: ", err) + if err := bucket.GetObjectToFile(key, filePath); err != nil { + log.Println("下载文件失败:", err) return err } }