From 8e20f10245d9cb876e35f277f98b41e6f9c8349c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E8=8F=AF?= Date: Thu, 20 Jul 2023 03:22:00 +0800 Subject: [PATCH] preview img --- main.go | 17 +++++++++-------- routers/models.go | 40 +++++++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index 4df5e47..f9c4235 100644 --- a/main.go +++ b/main.go @@ -51,14 +51,15 @@ func main() { r.HandleFunc("/api/users/{id}/like", routers.UsersItemLike).Methods("POST") // 添加一条喜欢 r.HandleFunc("/api/users/{id}/like", routers.UsersItemUnlike).Methods("DELETE") // 移除一条喜欢 - r.HandleFunc("/api/models", routers.ModelsGet).Methods("GET") // 获取模型列表 - r.HandleFunc("/api/models", routers.ModelsPost).Methods("POST") // 创建一条模型 - r.HandleFunc("/api/models/update", routers.ModelsUpdate).Methods("GET") // 更新模型列表 - r.HandleFunc("/api/models/{id}", routers.ModelItemGet).Methods("GET") // 获取一条模型 - r.HandleFunc("/api/models/{id}", routers.ModelItemPatch).Methods("PATCH") // 更新一条模型 - r.HandleFunc("/api/models/{id}", routers.ModelItemDelete).Methods("DELETE") // 删除一条模型 - r.HandleFunc("/api/models/{id}/like", routers.ModelsItemLike).Methods("POST") // 添加一条喜欢 - r.HandleFunc("/api/models/{id}/like", routers.ModelsItemUnlike).Methods("DELETE") // 移除一条喜欢 + r.HandleFunc("/api/models", routers.ModelsGet).Methods("GET") // 获取模型列表 + r.HandleFunc("/api/models", routers.ModelsPost).Methods("POST") // 创建一条模型 + r.HandleFunc("/api/models/update", routers.ModelsUpdate).Methods("GET") // 更新模型列表 + r.HandleFunc("/api/models/{id}", routers.ModelItemGet).Methods("GET") // 获取一条模型 + r.HandleFunc("/api/models/{id}", routers.ModelItemPatch).Methods("PATCH") // 更新一条模型 + r.HandleFunc("/api/models/{id}", routers.ModelItemDelete).Methods("DELETE") // 删除一条模型 + r.HandleFunc("/api/models/{id}/like", routers.ModelsItemLike).Methods("POST") // 添加一条喜欢 + r.HandleFunc("/api/models/{id}/like", routers.ModelsItemUnlike).Methods("DELETE") // 移除一条喜欢 + r.HandleFunc("/api/models/{id}/preview/{filename}", routers.ModelsItemPreview).Methods("GET") // 获取预览图片 r.HandleFunc("/api/images", routers.ImagesGet).Methods("GET") // 获取图片列表 r.HandleFunc("/api/images", routers.ImagesPost).Methods("POST") // 创建一条图片 diff --git a/routers/models.go b/routers/models.go index bbd229a..1ce2952 100644 --- a/routers/models.go +++ b/routers/models.go @@ -12,6 +12,7 @@ import ( "main/utils" "net/http" "os" + "regexp" "strconv" "github.com/gorilla/mux" @@ -233,6 +234,23 @@ func ModelItemGet(w http.ResponseWriter, r *http.Request) { w.Write(utils.ToJSON(model)) } +// 獲取模型預覽圖 +func ModelsItemPreview(w http.ResponseWriter, r *http.Request) { + var model = models.Model{ID: utils.ParamInt(mux.Vars(r)["id"], 0)} + var filepath = fmt.Sprintf("data/models/%d/preview/%s", model.ID, mux.Vars(r)["filename"]) + fmt.Println(filepath) + + // 檢查文件是否存在 + if _, err := os.Stat(filepath); err != nil { + w.WriteHeader(http.StatusNotFound) + w.Write([]byte(err.Error())) + return + } + + // 返回文件 + http.ServeFile(w, r, filepath) +} + // 更新模型 func ModelItemPatch(w http.ResponseWriter, r *http.Request) { var model = models.Model{ID: utils.ParamInt(mux.Vars(r)["id"], 0)} @@ -242,8 +260,13 @@ func ModelItemPatch(w http.ResponseWriter, r *http.Request) { return } + log.Println("更新模型:", model.Name) + log.Println("Content-Type:", r.Header.Get("Content-Type")) + // 判断数据类型是否二进制文件 - if r.Header.Get("Content-Type") == "multipart/form-data" { + if regexp.MustCompile(`multipart/form-data`).MatchString(r.Header.Get("Content-Type")) { + log.Println("更新模型:", model.Name) + // 解析表单取出图片文件 (32MB) if err := r.ParseMultipartForm(32 << 20); err != nil { log.Println(err) @@ -251,35 +274,34 @@ func ModelItemPatch(w http.ResponseWriter, r *http.Request) { } // 检查文件目录是否存在 - os.MkdirAll(fmt.Sprintf("data/models/%d", model.ID), 0777) + os.MkdirAll(fmt.Sprintf("data/models/%d/preview", model.ID), 0777) // 上传文件 - for _, headers := range r.MultipartForm.File { - for _, header := range headers { + for x, headers := range r.MultipartForm.File { + log.Println("x:", x) + for m, header := range headers { + log.Println("m:", m) // 打开本地文件 - file, err := os.Create(fmt.Sprintf("data/models/%d/%s", model.ID, header.Filename)) + file, err := os.Create(fmt.Sprintf("data/models/%d/preview/%s", model.ID, header.Filename)) if err != nil { log.Println(err) return } defer file.Close() - // 打开上传文件 f, err := header.Open() if err != nil { log.Println(err) return } - // 拷贝文件到本地 _, err = io.Copy(file, f) if err != nil { log.Println(err) return } - // 更新模型 - model.Preview = fmt.Sprintf("data/models/%d/%s", model.ID, header.Filename) + model.Preview = fmt.Sprintf("data/models/%d/preview/%s", model.ID, header.Filename) if err := configs.ORMDB().Save(&model).Error; err != nil { log.Println(err) return