From 61443bcd5245cd0669f0dedc89243994411a7f66 Mon Sep 17 00:00:00 2001
From: jiangshuai <291802688@qq.com>
Date: 星期三, 08 十一月 2023 14:14:44 +0800
Subject: [PATCH] 附件上传接口,交互文件服务器,缩略图制作
---
constvar/const.go | 23 ++
utils/upload/seaweed.go | 24 ++
controllers/attachment.go | 108 ++++++++++++
go.sum | 8
models/attachment.go | 256 ++++++++++++++++++++++++++++
utils/image/image.go | 74 ++++++++
conf/config.go | 12
go.mod | 4
models/db.go | 1
conf/config.yaml | 3
router/router.go | 6
11 files changed, 514 insertions(+), 5 deletions(-)
diff --git a/conf/config.go b/conf/config.go
index b50a0e7..700279a 100644
--- a/conf/config.go
+++ b/conf/config.go
@@ -23,11 +23,13 @@
type (
webConf struct {
- Host string // 鏈満ip鍦板潃
- Port string // 绔彛鍙�
- NodeId string // 涓昏处鎴风敤鎴峰悕
- OssType string // 瀵硅薄瀛樺偍绫诲瀷
- JWTSecret string
+ Host string // 鏈満ip鍦板潃
+ Port string // 绔彛鍙�
+ NodeId string // 涓昏处鎴风敤鎴峰悕
+ OssType string // 瀵硅薄瀛樺偍绫诲瀷
+ JWTSecret string
+ FileServer string //鏂囦欢鏈嶅姟鍣ㄥ湴鍧�
+ ServerId string //鏈嶅姟ID
}
localConf struct {
diff --git a/conf/config.yaml b/conf/config.yaml
index d2bef67..8b5a333 100644
--- a/conf/config.yaml
+++ b/conf/config.yaml
@@ -3,6 +3,9 @@
host: 192.168.20.119
nodeId: wangpengfei
ossType: local
+ # fileServer: http://172.20.11.129:6333
+ fileServer: http://192.168.20.189:6333
+ serverId: wms
db:
# dsn: root:c++java123@tcp(192.168.20.119:3306)/wms?charset=utf8&parseTime=True&loc=Local
dsn: root:c++java123@tcp(192.168.20.119:3306)/aps_server2?charset=utf8&parseTime=True&loc=Local
diff --git a/constvar/const.go b/constvar/const.go
index ff95383..d82cb6c 100644
--- a/constvar/const.go
+++ b/constvar/const.go
@@ -199,3 +199,26 @@
UserTypePrimary // 涓昏处鎴�
UserTypeSub // 瀛愯处鎴�
)
+
+type FileType string
+
+const (
+ FileType_File FileType = "file" //鏂囦欢
+ FileType_Picture FileType = "picture" //鍥剧墖
+ FileType_Thumbnail FileType = "thumbnail" //缂╃暐鍥�
+)
+
+var FileExtMap = map[string]FileType{
+ "doc": FileType_File,
+ "docx": FileType_File,
+ "xls": FileType_File,
+ "xlsx": FileType_File,
+ "txt": FileType_File,
+}
+
+var PicExtMap = map[string]FileType{
+ "jpg": FileType_Picture,
+ "jpeg": FileType_Picture,
+ "png": FileType_Picture,
+ "svg": FileType_Picture,
+}
diff --git a/controllers/attachment.go b/controllers/attachment.go
new file mode 100644
index 0000000..f4b1b11
--- /dev/null
+++ b/controllers/attachment.go
@@ -0,0 +1,108 @@
+package controllers
+
+import (
+ "bytes"
+ "github.com/gin-gonic/gin"
+ "io"
+ "path"
+ "strings"
+ "wms/constvar"
+ "wms/extend/code"
+ "wms/extend/util"
+ "wms/models"
+ "wms/pkg/logx"
+ "wms/utils/image"
+ "wms/utils/upload"
+)
+
+type AttachmentController struct {
+}
+
+// UploadFiles
+//
+// @Tags 闄勪欢绠$悊
+// @Summary 涓婁紶闄勪欢
+// @Success 200 {object} util.Response "鎴愬姛"
+// @Router /api-wms/v1/attachment/uploadFiles [post]
+func (slf AttachmentController) UploadFiles(c *gin.Context) {
+ form, err := c.MultipartForm()
+ if err != nil {
+ logx.Errorf("file upload err: %v", err)
+ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触")
+ return
+ }
+ files := form.File["files"]
+
+ var attachmentList []*models.Attachment
+ for _, fileHeader := range files {
+ ext := strings.ToLower(path.Ext(fileHeader.Filename))[1:]
+ var fileType constvar.FileType
+ if value, ok := constvar.FileExtMap[ext]; ok {
+ fileType = value
+ }
+ if value, ok := constvar.PicExtMap[ext]; ok {
+ fileType = value
+ }
+ if fileType == "" {
+ logx.Errorf("file upload err: 涓嶆敮鎸佷笂浼犺鏍煎紡鐨勬枃浠�")
+ util.ResponseFormat(c, code.RequestParamError, "涓嶆敮鎸佷笂浼犺鏍煎紡鐨勬枃浠�")
+ return
+ }
+ file, err := fileHeader.Open()
+ if err != nil {
+ logx.Errorf("file upload err: %v", err)
+ util.ResponseFormat(c, code.RequestParamError, "閿欒鏂囦欢")
+ return
+ }
+ buffer := new(bytes.Buffer)
+ _, _ = io.Copy(buffer, file)
+ fileBytes := buffer.Bytes()
+ fileUrl, err := upload.UploadFileToSeaWeed(string(fileType), ext, fileBytes)
+ if err != nil {
+ logx.Errorf("file upload err: %v", err)
+ util.ResponseFormat(c, code.RequestParamError, err.Error())
+ return
+ }
+
+ attachment := &models.Attachment{
+ FileName: fileHeader.Filename,
+ FileUrl: fileUrl,
+ Ext: ext,
+ FileType: fileType,
+ }
+ attachmentList = append(attachmentList, attachment)
+
+ if fileType == constvar.FileType_Picture {
+ thumbnailBytes, err := image.CreateThumbnail(fileBytes, 0, 600, 800)
+ if err != nil {
+ logx.Errorf("file upload err: %v", err)
+ util.ResponseFormat(c, code.RequestParamError, "鐢熸垚缂╃暐鍥惧け璐ワ細"+err.Error())
+ return
+ }
+ thumbnailUrl, err := upload.UploadFileToSeaWeed(string(constvar.FileType_Thumbnail), ext, thumbnailBytes)
+ if err != nil {
+ logx.Errorf("file upload err: %v", err)
+ util.ResponseFormat(c, code.RequestParamError, err.Error())
+ return
+ }
+
+ thumbAttach := &models.Attachment{
+ FileName: fileHeader.Filename,
+ FileUrl: thumbnailUrl,
+ Ext: ext,
+ FileType: constvar.FileType_Thumbnail,
+ }
+ attachmentList = append(attachmentList, thumbAttach)
+ }
+ }
+
+ if len(attachmentList) > 0 {
+ if attachmentList, err = models.NewAttachmentSearch().CreateBatchWithResp(attachmentList); err != nil {
+ logx.Errorf("attachment create err: %v", err)
+ util.ResponseFormat(c, code.SaveFail, "鏂囦欢淇濆瓨澶辫触")
+ return
+ }
+ }
+
+ util.ResponseFormat(c, code.Success, attachmentList)
+}
diff --git a/go.mod b/go.mod
index 371244a..33e950a 100644
--- a/go.mod
+++ b/go.mod
@@ -4,6 +4,7 @@
require (
basic.com/aps/nsqclient.git v0.0.0-20230517072415-37491f4a5d25
+ basic.com/fileserver/WeedFSClient.git v0.0.0-20210224075854-9e78086ab4bf
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gin-gonic/gin v1.9.0
github.com/golang-jwt/jwt/v4 v4.5.0
@@ -57,6 +58,7 @@
github.com/jinzhu/now v1.1.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
+ github.com/kirinlabs/HttpRequest v1.1.1 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/magiconair/properties v1.8.7 // indirect
@@ -66,12 +68,14 @@
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
github.com/pelletier/go-toml/v2 v2.0.9 // indirect
github.com/prometheus/client_golang v1.16.0 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.10.1 // indirect
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect
+ github.com/satori/go.uuid v1.2.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spf13/afero v1.9.3 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
diff --git a/go.sum b/go.sum
index a602140..2932a9d 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,7 @@
basic.com/aps/nsqclient.git v0.0.0-20230517072415-37491f4a5d25 h1:sZyNfIISgP1eoY94LG48Kav6HYVLem6EzaEbCeXlcXQ=
basic.com/aps/nsqclient.git v0.0.0-20230517072415-37491f4a5d25/go.mod h1:1RnwEtePLR7ATQorQTxdgvs1o7uuUy1Vw8W7GYtVnoY=
+basic.com/fileserver/WeedFSClient.git v0.0.0-20210224075854-9e78086ab4bf h1:HGhtGSBibh1OV4oUe1SWw8DLfL4hXGGBFNW3dpcr+70=
+basic.com/fileserver/WeedFSClient.git v0.0.0-20210224075854-9e78086ab4bf/go.mod h1:oiXPn3wwwOi/Sbm6cDWpNWofoG5iV2Nb1V/DxLEAqYY=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -230,6 +232,8 @@
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kirinlabs/HttpRequest v1.1.1 h1:eBbFzpRd/Y7vQhRY30frHK3yAJiT1wDlB31Ryzyklc0=
+github.com/kirinlabs/HttpRequest v1.1.1/go.mod h1:XV38fA4rXZox83tlEV9KIQ7Cdsut319x6NGzVLuRlB8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
@@ -264,6 +268,8 @@
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
+github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE=
github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
@@ -290,6 +296,8 @@
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
diff --git a/models/attachment.go b/models/attachment.go
new file mode 100644
index 0000000..24438cc
--- /dev/null
+++ b/models/attachment.go
@@ -0,0 +1,256 @@
+package models
+
+import (
+ "fmt"
+ "gorm.io/gorm"
+ "wms/constvar"
+ "wms/pkg/mysqlx"
+)
+
+type (
+ Attachment struct {
+ WmsModel
+ Id int `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+ FileName string `json:"fileName" gorm:"type:varchar(127);comment:鏂囦欢鍚�"`
+ FileUrl string `json:"FileUrl" gorm:"type:varchar(255);comment:鏂囦欢鍦板潃"`
+ Ext string `json:"ext" gorm:"type:varchar(15);comment:鏂囦欢鍚庣紑鍚�"`
+ FileType constvar.FileType `json:"fileType" gorm:"type:varchar(31);comment:鏂囦欢绫诲瀷 pic:鍥剧墖;thumbnail:缂╃暐鍥�;file:鏂囦欢"`
+ }
+
+ AttachmentSearch struct {
+ Attachment
+ Order string
+ PageNum int
+ PageSize int
+ Keyword string
+ Orm *gorm.DB
+ Preload bool
+ }
+)
+
+func (slf *Attachment) TableName() string {
+ return "wms_attachment"
+}
+
+func NewAttachmentSearch() *AttachmentSearch {
+ return &AttachmentSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *AttachmentSearch) SetOrm(tx *gorm.DB) *AttachmentSearch {
+ slf.Orm = tx
+ return slf
+}
+
+func (slf *AttachmentSearch) SetPage(page, size int) *AttachmentSearch {
+ slf.PageNum, slf.PageSize = page, size
+ return slf
+}
+
+func (slf *AttachmentSearch) SetOrder(order string) *AttachmentSearch {
+ slf.Order = order
+ return slf
+}
+
+func (slf *AttachmentSearch) SetID(ID int) *AttachmentSearch {
+ slf.Id = ID
+ return slf
+}
+
+func (slf *AttachmentSearch) SetKeyword(keyword string) *AttachmentSearch {
+ slf.Keyword = keyword
+ return slf
+}
+
+func (slf *AttachmentSearch) SetPreload(preload bool) *AttachmentSearch {
+ slf.Preload = preload
+ return slf
+}
+
+func (slf *AttachmentSearch) build() *gorm.DB {
+ var db = slf.Orm.Model(&Attachment{})
+
+ if slf.Id != 0 {
+ db = db.Where("id = ?", slf.Id)
+ }
+ if slf.Order != "" {
+ db = db.Order(slf.Order)
+ }
+
+ if slf.Keyword != "" {
+ db = db.Where("number like ? or source_number like ?", fmt.Sprintf("%%%v%%", slf.Keyword), fmt.Sprintf("%%%v%%", slf.Keyword))
+ }
+
+ //if slf.Preload {
+ // db = db.Model(&Attachment{}).Preload("Details").Preload("Details.Product").Preload("FromLocation").Preload("ToLocation")
+ //}
+
+ return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *AttachmentSearch) Create(record *Attachment) error {
+ var db = slf.build()
+
+ if err := db.Create(record).Error; err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *AttachmentSearch) CreateBatch(records []*Attachment) error {
+ var db = slf.build()
+
+ if err := db.Create(&records).Error; err != nil {
+ return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+ }
+
+ return nil
+}
+
+func (slf *AttachmentSearch) Save(record *Attachment) error {
+ var db = slf.build()
+
+ if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+ return fmt.Errorf("save err: %v, record: %+v", err, record)
+ }
+
+ return nil
+}
+
+func (slf *AttachmentSearch) Update(record *Attachment) error {
+ var db = slf.build()
+
+ if err := db.Omit("CreatedAt").Updates(record).Error; err != nil {
+ return fmt.Errorf("save err: %v, record: %+v", err, record)
+ }
+
+ return nil
+}
+
+func (slf *AttachmentSearch) UpdateByMap(upMap map[string]interface{}) error {
+ var (
+ db = slf.build()
+ )
+
+ if err := db.Updates(upMap).Error; err != nil {
+ return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
+ }
+
+ return nil
+}
+
+func (slf *AttachmentSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
+ var (
+ db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+ )
+
+ if err := db.Updates(upMap).Error; err != nil {
+ return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
+ }
+
+ return nil
+}
+
+func (slf *AttachmentSearch) Delete() error {
+ var db = slf.build()
+ return db.Delete(&Attachment{}).Error
+}
+
+func (slf *AttachmentSearch) First() (*Attachment, error) {
+ var (
+ record = new(Attachment)
+ db = slf.build()
+ )
+
+ if err := db.First(record).Error; err != nil {
+ return record, err
+ }
+
+ return record, nil
+}
+
+func (slf *AttachmentSearch) Find() ([]*Attachment, int64, error) {
+ var (
+ records = make([]*Attachment, 0)
+ total int64
+ db = slf.build()
+ )
+
+ if err := db.Count(&total).Error; err != nil {
+ return records, total, fmt.Errorf("find count err: %v", err)
+ }
+ if slf.PageNum*slf.PageSize > 0 {
+ db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+ }
+ if err := db.Order("created_at desc").Find(&records).Error; err != nil {
+ return records, total, fmt.Errorf("find records err: %v", err)
+ }
+
+ return records, total, nil
+}
+
+func (slf *AttachmentSearch) FindNotTotal() ([]*Attachment, error) {
+ var (
+ records = make([]*Attachment, 0)
+ db = slf.build()
+ )
+
+ if slf.PageNum*slf.PageSize > 0 {
+ db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+ }
+ if err := db.Preload("FromLocation").Preload("ToLocation").Find(&records).Error; err != nil {
+ return records, fmt.Errorf("find records err: %v", err)
+ }
+
+ return records, nil
+}
+
+// FindByQuery 鎸囧畾鏉′欢鏌ヨ.
+func (slf *AttachmentSearch) FindByQuery(query string, args []interface{}) ([]*Attachment, int64, error) {
+ var (
+ records = make([]*Attachment, 0)
+ total int64
+ db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+ )
+
+ if err := db.Count(&total).Error; err != nil {
+ return records, total, fmt.Errorf("find by query count err: %v", err)
+ }
+ if slf.PageNum*slf.PageSize > 0 {
+ db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+ }
+ if err := db.Find(&records).Error; err != nil {
+ return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+ }
+
+ return records, total, nil
+}
+
+// FindByQueryNotTotal 鎸囧畾鏉′欢鏌ヨ&涓嶆煡璇㈡�绘潯鏁�.
+func (slf *AttachmentSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*Attachment, error) {
+ var (
+ records = make([]*Attachment, 0)
+ db = slf.Orm.Table(slf.TableName()).Where(query, args...)
+ )
+
+ if slf.PageNum*slf.PageSize > 0 {
+ db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+ }
+ if err := db.Find(&records).Error; err != nil {
+ return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
+ }
+
+ return records, nil
+}
+
+func (slf *AttachmentSearch) CreateBatchWithResp(records []*Attachment) ([]*Attachment, error) {
+ var db = slf.build()
+
+ if err := db.Create(&records).Error; err != nil {
+ return nil, fmt.Errorf("create batch err: %v, records: %+v", err, records)
+ }
+
+ return records, nil
+}
diff --git a/models/db.go b/models/db.go
index 480edaa..bb59b3b 100644
--- a/models/db.go
+++ b/models/db.go
@@ -86,6 +86,7 @@
LocationProduct{},
LocationProductAmount{},
ReorderRule{},
+ Attachment{},
)
return err
}
diff --git a/router/router.go b/router/router.go
index b4dac9f..27e49d9 100644
--- a/router/router.go
+++ b/router/router.go
@@ -155,5 +155,11 @@
reorderRuleAPI.POST("orderAgain", reorderRuleController.OrderAgain) //鍐嶈涓�娆�
}
+ attachmentController := new(controllers.AttachmentController)
+ attachmentAPI := r.Group(urlPrefix + "/attachment")
+ {
+ attachmentAPI.POST("uploadFiles", attachmentController.UploadFiles) //涓婁紶鏂囦欢
+ }
+
return r
}
diff --git a/utils/image/image.go b/utils/image/image.go
new file mode 100644
index 0000000..237bae9
--- /dev/null
+++ b/utils/image/image.go
@@ -0,0 +1,74 @@
+package image
+
+import (
+ "bytes"
+ "errors"
+ "github.com/nfnt/resize"
+ "image"
+ "image/jpeg"
+ "image/png"
+ "strings"
+)
+
+func CreateThumbnail(fileBytes []byte, side, width, height int) ([]byte, error) {
+ img, format, err := image.Decode(bytes.NewReader(fileBytes))
+ if err != nil {
+ return nil, err
+ }
+
+ var thumbnailImg image.Image
+ if side > 0 {
+ var canvas image.Image
+ s := side
+ sz := img.Bounds().Size()
+
+ if sz.X > sz.Y {
+ canvas = resize.Thumbnail(uint(sz.X), uint(s), img, resize.Lanczos2)
+ } else {
+ canvas = resize.Thumbnail(uint(s), uint(sz.Y), img, resize.Lanczos2)
+ }
+ sz = canvas.Bounds().Size()
+ var l, t, r, b int
+ if sz.X > s {
+ l = (sz.X - s) / 2
+ r = l + s
+ } else {
+ l = 0
+ r = sz.X
+ }
+ if sz.Y > s {
+ t = (sz.Y - s) / 2
+ b = t + s
+ } else {
+ t = 0
+ b = sz.Y
+ }
+
+ thumbnailImg = canvas.(*image.YCbCr).SubImage(image.Rect(l, t, r, b)).(*image.YCbCr)
+ } else {
+ w := width
+ h := height
+ if w > 0 && h > 0 {
+ } else if w > 0 {
+ h = img.Bounds().Dy()
+ } else {
+ w = img.Bounds().Dx()
+ }
+ thumbnailImg = resize.Thumbnail(uint(w), uint(h), img, resize.Lanczos2)
+ }
+
+ buffer := new(bytes.Buffer)
+ format = strings.ToLower(format)
+ if format == "jpg" || format == "jpeg" {
+ if err := jpeg.Encode(buffer, thumbnailImg, nil); err != nil {
+ return nil, err
+ }
+ } else if format == "png" {
+ if err := png.Encode(buffer, thumbnailImg); err != nil {
+ return nil, err
+ }
+ } else {
+ return nil, errors.New("涓嶆敮鎸佺殑鏂囦欢鏍煎紡")
+ }
+ return buffer.Bytes(), nil
+}
diff --git a/utils/upload/seaweed.go b/utils/upload/seaweed.go
index acc30e6..931df16 100644
--- a/utils/upload/seaweed.go
+++ b/utils/upload/seaweed.go
@@ -1 +1,25 @@
package upload
+
+import (
+ "basic.com/fileserver/WeedFSClient.git"
+ uuid "github.com/satori/go.uuid"
+ "strconv"
+ "time"
+ "wms/conf"
+ "wms/pkg/logx"
+)
+
+func UploadFileToSeaWeed(fileType, ext string, fileBytes []byte) (string, error) {
+ //assignUrl := conf.WebConf.FileServer + "/dir/assign?collection=" + time.Now().Format("2006-01-02 15:04:05")[:10] + "-" + conf.WebConf.ServerId + "-" + fileType
+ assignUrl := conf.WebConf.FileServer + "/dir/assign?collection=" + strconv.FormatInt(time.Now().Unix(), 10) + "-" + conf.WebConf.ServerId + "-" + fileType
+
+ picUrl, err := WeedFSClient.GetFid(assignUrl)
+ if err != nil {
+ logx.Error(err.Error())
+ return picUrl, err
+ }
+
+ picFileName := uuid.NewV4().String() + "." + ext
+ go WeedFSClient.UploadFile(picUrl, picFileName, fileBytes, 3*time.Second)
+ return picUrl, nil
+}
--
Gitblit v1.8.0