refactor(utils): 修复密码哈希比较逻辑错误 feat(user): 新增按状态筛选优惠券接口 docs: 添加虚拟发货与任务中心相关文档 fix(wechat): 修正Code2Session上下文传递问题 test: 补充订单折扣与积分转换测试用例 build: 更新配置文件与构建脚本 style: 清理多余的空行与注释
76 lines
2.4 KiB
Go
76 lines
2.4 KiB
Go
package common
|
||
|
||
import (
|
||
"net/http"
|
||
"strings"
|
||
|
||
"bindbox-game/internal/code"
|
||
"bindbox-game/internal/pkg/core"
|
||
)
|
||
|
||
// @Summary WangEditor图片上传
|
||
// @Description 适配 WangEditor 的图片上传接口
|
||
// @Tags Common
|
||
// @Accept multipart/form-data
|
||
// @Produce json
|
||
// @Param file formData file true "图片文件"
|
||
// @Success 200 {object} map[string]any "上传成功"
|
||
// @Failure 400 {object} map[string]any "上传失败"
|
||
// @Router /common/upload/wangeditor [post]
|
||
func (h *handler) UploadWangEditorImage() core.HandlerFunc {
|
||
return func(ctx core.Context) {
|
||
fh, err := ctx.FormFile("file")
|
||
if err != nil {
|
||
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "缺少文件"))
|
||
return
|
||
}
|
||
// 限制文件大小不超过 5MB
|
||
if fh.Size > 5*1024*1024 {
|
||
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.UploadError, "图片大小不能超过5MB"))
|
||
return
|
||
}
|
||
f, err := fh.Open()
|
||
if err != nil {
|
||
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.UploadError, err.Error()))
|
||
return
|
||
}
|
||
defer f.Close()
|
||
|
||
ct := fh.Header.Get("Content-Type")
|
||
if ct == "" {
|
||
ct = "application/octet-stream"
|
||
}
|
||
// 校验图片类型
|
||
allowed := map[string]struct{}{
|
||
"image/jpeg": {},
|
||
"image/jpg": {},
|
||
"image/png": {},
|
||
"image/gif": {},
|
||
"image/webp": {},
|
||
"image/bmp": {},
|
||
}
|
||
if ct == "application/octet-stream" {
|
||
// 一些浏览器可能未设置 content-type,允许继续,服务端会按扩展名纠正
|
||
} else if _, ok := allowed[strings.ToLower(ct)]; !ok {
|
||
if !strings.HasPrefix(strings.ToLower(ct), "image/") {
|
||
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.UploadError, "仅支持上传图片类型"))
|
||
return
|
||
}
|
||
}
|
||
|
||
url, err := h.svc.UploadImage(ctx.RequestContext(), fh.Filename, f, ct)
|
||
if err != nil {
|
||
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.UploadError, err.Error()))
|
||
return
|
||
}
|
||
|
||
resp := map[string]any{
|
||
"errno": 0,
|
||
"data": map[string]string{
|
||
"url": url,
|
||
},
|
||
}
|
||
ctx.Payload(resp)
|
||
}
|
||
}
|