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