[ADD]上传图片

This commit is contained in:
viletyy 2020-09-26 19:06:41 +08:00
parent 2095dca48e
commit ef2d1dbbc4
12 changed files with 282 additions and 21 deletions

View File

@ -5,7 +5,7 @@ JwtSecret = 233
RuntimeRootPath = runtime/ RuntimeRootPath = runtime/
ImagePrefixUrl = http://127.0.0.8002 ImagePrefixUrl = http://127.0.0.8002
ImageSavePath = upload/images/ ImageSavePath = upload/images/
ImageMaxSize = 5 ImageMaxSize = 1024
ImageAllowExts = .jpg,.jpeg,.png ImageAllowExts = .jpg,.jpeg,.png
logSavePath = logs/ logSavePath = logs/

View File

@ -266,6 +266,41 @@ var doc = `{
} }
} }
} }
},
"/admin/v1/upload": {
"post": {
"consumes": [
"multipart/form-data"
],
"produces": [
"application/json"
],
"summary": "上传图片",
"parameters": [
{
"type": "string",
"description": "auth by /admin/login",
"name": "Authorization",
"in": "header",
"required": true
},
{
"type": "file",
"description": "imageFile",
"name": "image",
"in": "formData",
"required": true
}
],
"responses": {
"200": {
"description": "{\"code\":200,\"data\":{},\"msg\":\"ok\"}",
"schema": {
"type": "string"
}
}
}
}
} }
} }
}` }`

View File

@ -246,6 +246,41 @@
} }
} }
} }
},
"/admin/v1/upload": {
"post": {
"consumes": [
"multipart/form-data"
],
"produces": [
"application/json"
],
"summary": "上传图片",
"parameters": [
{
"type": "string",
"description": "auth by /admin/login",
"name": "Authorization",
"in": "header",
"required": true
},
{
"type": "file",
"description": "imageFile",
"name": "image",
"in": "formData",
"required": true
}
],
"responses": {
"200": {
"description": "{\"code\":200,\"data\":{},\"msg\":\"ok\"}",
"schema": {
"type": "string"
}
}
}
}
} }
} }
} }

View File

@ -163,4 +163,27 @@ paths:
summary: 更新员工 summary: 更新员工
tags: tags:
- employees - employees
/admin/v1/upload:
post:
consumes:
- multipart/form-data
parameters:
- description: auth by /admin/login
in: header
name: Authorization
required: true
type: string
- description: imageFile
in: formData
name: image
required: true
type: file
produces:
- application/json
responses:
"200":
description: '{"code":200,"data":{},"msg":"ok"}'
schema:
type: string
summary: 上传图片
swagger: "2.0" swagger: "2.0"

View File

@ -2,6 +2,7 @@ package models
type Employee struct { type Employee struct {
Model Model
AvatarUrl string `json:"avatar_url"`
Username string `json:"username"` Username string `json:"username"`
Password string `json:"password"` Password string `json:"password"`
Department string `json:"department"` Department string `json:"department"`
@ -75,4 +76,4 @@ func CleaanAllEmployee() bool {
db.Unscoped().Where("deleted_on != ?", 0).Delete(&Employee{}) db.Unscoped().Where("deleted_on != ?", 0).Delete(&Employee{})
return true return true
} }

View File

@ -1,14 +1,17 @@
package e package e
const ( const (
SUCCESS = 200 SUCCESS = 200
ERROR = 500 ERROR = 500
InvalidParams = 400 InvalidParams = 400
ErrorAuthCheckTokenFail = 10001 ErrorAuthCheckTokenFail = 10001
ErrorAuthCheckTokenTimeout = 10002 ErrorAuthCheckTokenTimeout = 10002
ErrorAuthToken = 10003 ErrorAuthToken = 10003
ErrorAuth = 10004 ErrorAuth = 10004
ErrorUploadSaveImageFail = 10005
ErrorUploadCheckImageFail = 10006
ErrorUploadCheckImageFormat = 10007
ErrorExistEmployee = 20001 ErrorExistEmployee = 20001
ErrorNotExistEmployee = 20002 ErrorNotExistEmployee = 20002
) )

View File

@ -1,15 +1,18 @@
package e package e
var MsgFlags = map[int]string{ var MsgFlags = map[int]string{
SUCCESS: "ok", SUCCESS: "ok",
ERROR: "fail", ERROR: "fail",
InvalidParams: "请求参数错误", InvalidParams: "请求参数错误",
ErrorAuthCheckTokenFail: "TOKEN鉴权失败", ErrorAuthCheckTokenFail: "TOKEN鉴权失败",
ErrorAuthCheckTokenTimeout: "TOKEN已超时", ErrorAuthCheckTokenTimeout: "TOKEN已超时",
ErrorAuthToken: "TOKEN生成失败", ErrorAuthToken: "TOKEN生成失败",
ErrorAuth: "TOKEN错误", ErrorAuth: "TOKEN错误",
ErrorExistEmployee: "已存在该员工用户名", ErrorUploadSaveImageFail: "保存图片错误",
ErrorNotExistEmployee: "该员工不存在", ErrorUploadCheckImageFail: "检查图片失败",
ErrorUploadCheckImageFormat: "校验图片错误,图片格式或大小有问题",
ErrorExistEmployee: "已存在该员工用户名",
ErrorNotExistEmployee: "该员工不存在",
} }
func GetMsg(code int) string { func GetMsg(code int) string {

83
pkg/upload/image.go Normal file
View File

@ -0,0 +1,83 @@
package upload
import (
"fmt"
"github.com/go-pripro/shop/pkg/file"
"github.com/go-pripro/shop/pkg/logging"
"github.com/go-pripro/shop/pkg/setting"
"github.com/go-pripro/shop/pkg/util"
"log"
"mime/multipart"
"os"
"path"
"strings"
)
// 获取图片完整访问URL
func GetImageFullUrl(name string) string {
return setting.AppSetting.ImagePrefixUrl + "/" + GetImagePath() + name
}
// 获取图片名称
func GetImageName(name string) string {
ext := path.Ext(name)
fileName := strings.TrimSuffix(name, ext)
fileName = util.EncodeMD5(fileName)
return fileName + ext
}
// 获取图片路径
func GetImagePath() string {
return setting.AppSetting.ImageSavePath
}
// 获取图片完整路径
func GetImageFullPath() string {
return setting.AppSetting.RuntimeRootPath + GetImagePath()
}
// 检查图片后缀
func CheckImageExt(fileName string) bool {
ext := file.GetExt(fileName)
for _, allowExt := range setting.AppSetting.ImageAllowExts {
if strings.ToUpper(allowExt) == strings.ToUpper(ext) {
return true
}
}
return false
}
// 检查图片大小
func CheckImageSize(f multipart.File) bool {
size, err := file.GetSize(f)
logging.Info(size)
if err != nil {
log.Println(err)
logging.Warn(err)
return false
}
return size <= setting.AppSetting.ImageMaxSize*1024*1024
}
// 检查图片
func CheckImage(src string) error {
dir, err := os.Getwd()
if err != nil {
return fmt.Errorf("os.Getwd err:%v", err)
}
err = file.IsNotExistMkDir(dir + "/" + src)
if err != nil {
return fmt.Errorf("file.IsNotExistMkDir err: %v", err)
}
perm := file.CheckPermission(src)
if perm == true {
return fmt.Errorf("file.CheckPermission Permission denied src: %s", src)
}
return nil
}

13
pkg/util/md5.go Normal file
View File

@ -0,0 +1,13 @@
package util
import (
"crypto/md5"
"encoding/hex"
)
func EncodeMD5(value string) string {
m := md5.New()
m.Write([]byte(value))
return hex.EncodeToString(m.Sum(nil))
}

View File

@ -14,6 +14,8 @@ func InitAdmin(r *gin.Engine) *gin.Engine {
adminv1 := r.Group("/admin/v1") adminv1 := r.Group("/admin/v1")
adminv1.Use(jwt.JWT()) adminv1.Use(jwt.JWT())
{ {
// 上传图片
adminv1.POST("/upload", admin.UploadImage)
// 获取员工列表 // 获取员工列表
adminv1.GET("/employees", v1.GetEmployees) adminv1.GET("/employees", v1.GetEmployees)
// 获取指定员工列表 // 获取指定员工列表

64
routers/admin/upload.go Normal file
View File

@ -0,0 +1,64 @@
package admin
import (
"github.com/gin-gonic/gin"
"github.com/go-pripro/shop/pkg/e"
"github.com/go-pripro/shop/pkg/logging"
"github.com/go-pripro/shop/pkg/upload"
"net/http"
)
// @Summary 上传图片
// @Description
// @Accept mpfd
// @Produce json
// @Param Authorization header string true "auth by /admin/login"
// @Param image formData file true "imageFile"
// @Success 200 {string} json "{"code":200,"data":{},"msg":"ok"}"
// @Router /admin/v1/upload [post]
func UploadImage(c *gin.Context) {
code := e.SUCCESS
data := make(map[string]string)
file, image, err := c.Request.FormFile("image")
if err != nil {
logging.Warn(err)
code = e.ERROR
c.JSON(http.StatusOK, gin.H{
"code": code,
"msg": e.GetMsg(code),
"data": data,
})
}
if image == nil {
code = e.InvalidParams
} else {
imageName := upload.GetImageName(image.Filename)
fullPath := upload.GetImageFullPath()
savePath := upload.GetImagePath()
src := fullPath + imageName
if !upload.CheckImageExt(imageName) || !upload.CheckImageSize(file) {
code = e.ErrorUploadCheckImageFormat
} else {
err := upload.CheckImage(fullPath)
if err != nil {
logging.Warn(err)
code = e.ErrorUploadCheckImageFail
} else if err := c.SaveUploadedFile(image, src); err != nil {
logging.Warn(err)
code = e.ErrorUploadSaveImageFail
} else {
data["image_url"] = upload.GetImageFullUrl(imageName)
data["image_save_url"] = savePath + imageName
}
}
}
c.JSON(http.StatusOK, gin.H{
"code" : code,
"msg" : e.GetMsg(code),
"data" : data,
})
}

View File

@ -1 +0,0 @@
package routers