From 310797a6e08a04de1e2d53b4bba1f5afb037b422 Mon Sep 17 00:00:00 2001 From: satori Date: Mon, 30 Dec 2024 22:48:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=20oss=20=E4=B8=8B=E8=BD=BD=E5=8E=9F?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + models/image.go | 64 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index d1d8fa4..5554262 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ data dist tmp +oss diff --git a/models/image.go b/models/image.go index fba786f..8901ea4 100644 --- a/models/image.go +++ b/models/image.go @@ -1,10 +1,13 @@ package models import ( + "fmt" "image" "io" "log" "net/http" + "os" + "path/filepath" "regexp" "github.com/chai2010/webp" @@ -20,18 +23,45 @@ type Image struct { } // 初始化图片 -func (img *Image) Init(content string) (err error) { - var body io.ReadCloser +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) - // 从OSS中读取图片 - bucket := GetBucket("gameui-image2") - body, err = bucket.GetObject(key) + // 先检查本地是否存在原图, 没有则从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 := 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) + return err + } + } + + // 从本地打开文件 + body, err := os.Open(filePath) if err != nil { - log.Println("读取图片失败", err) - return + log.Println("打开本地图片失败:", err) + return err } defer body.Close() @@ -42,25 +72,25 @@ func (img *Image) Init(content string) (err error) { if err != nil { log.Println("读取图片失败", err) - return + return err } - return + return nil } // 将文件解码为 image.Image img.image, img.format, err = image.Decode(body) if err != nil { log.Println("解码图像失败", err) - return + return err } - return + return nil } else { var resp *http.Response log.Println("直接从网络下载图片:", content) - resp, err = http.Get(content) + resp, err := http.Get(content) if err != nil { log.Println("下载图片失败", err) - return + return err } defer resp.Body.Close() @@ -70,19 +100,19 @@ func (img *Image) Init(content string) (err error) { img.data, err = io.ReadAll(resp.Body) if err != nil { log.Println("读取图片失败", err) - return + return err } println("数据长度:", len(img.data)) - return + return nil } // 将文件解码为 image.Image img.image, img.format, err = image.Decode(resp.Body) if err != nil { log.Println("解码图像失败", err) - return + return nil } - return + return nil } }