[ADD]上传图片
This commit is contained in:
parent
2095dca48e
commit
ef2d1dbbc4
|
@ -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/
|
||||||
|
|
35
docs/docs.go
35
docs/docs.go
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}`
|
}`
|
||||||
|
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
21
pkg/e/msg.go
21
pkg/e/msg.go
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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))
|
||||||
|
}
|
|
@ -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)
|
||||||
// 获取指定员工列表
|
// 获取指定员工列表
|
||||||
|
|
|
@ -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,
|
||||||
|
})
|
||||||
|
}
|
|
@ -1 +0,0 @@
|
||||||
package routers
|
|
Loading…
Reference in New Issue