Prechádzať zdrojové kódy

添加上传文件、下载文件和删除文件接口的实现

wuww 6 rokov pred
rodič
commit
eb08912a1a
1 zmenil súbory, kde vykonal 106 pridanie a 27 odobranie
  1. 106 27
      controllers/partial/SysAttachmentController.go

+ 106 - 27
controllers/partial/SysAttachmentController.go

@@ -1,28 +1,31 @@
-
 package partial
 
 import (
-	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
-    //sysutils "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
-	//"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	sysutils "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
+	syslogs "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	"strconv"
+	"strings"
+	"errors"
+	"bytes"
+	"path"
+	"mime"
+	"time"
+	"io"
 )
 
-
-
-
 // _Upload
 // @Title _Upload
 // @Description 上传文件         
 // @Success 200 {object} Account
 // @Failure 403 :id is empty
 func SysAttachment_Upload(c *entitys.CtrlContext) {
-	
-	ret := __none_func_sys_attachment__()
-	if ret {
-		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
-	}else{
-		c.Ctx.JSON(500, sysmodel.SysReturn{500, "", nil})
+	attach, err := doUpload(c)
+	if err == nil {
+		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attach.Id})
+	} else {
+		c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
 	}
 }
 
@@ -33,14 +36,62 @@ func SysAttachment_Upload(c *entitys.CtrlContext) {
 // @Success 200 {object} Account
 // @Failure 403 :id is empty
 func SysAttachment_Download(c *entitys.CtrlContext) {
-	id := c.Ctx.Query("id")
+	attrId := c.Ctx.Query("id")
+	gt := c.Ctx.Query("get_thumb")
+	var attach sysmodel.SysAttachment
+	exist, err := c.Db.SqlMapClient("selectone_sys_attachment", &map[string]interface{}{"id": attrId}).Get(&attach)
+	if !exist && err == nil {
+		err = errors.New("record does not exist")
+	}
+	if err != nil {
+		syslogs.Error("获取附件出错了:", err)
+		c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
+		return
+	}
+	durl := attach.Url
+	if gt != "" {
+		durl += "?getthumb=" + gt
+	}
+	resultBody, err := sysutils.GetFile(durl)
+	if err != nil {
+		syslogs.Error("下载附件出错了:", err)
+		c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
+		return
+	}
+	defer resultBody.Close()
+
+	bbuf := bytes.NewBuffer([]byte{})
+
+	c.Ctx.Header("Content-Disposition", "attachment;filename=\""+sysutils.FormatForBrowse(c.Ctx.Request.UserAgent(), attach.Name)+"\"")
+	c.Ctx.Header("Content-Type", strings.Replace(mime.TypeByExtension(attach.Ext), "charset=utf-8", "", -1))
 
-	ret := __none_func_sys_attachment__(id)
-	if ret {
-		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
-	}else{
-		c.Ctx.JSON(500, sysmodel.SysReturn{500, "", nil})
+	buff := make([]byte, 1024)
+	var ssize int64 = 0
+
+	for {
+		n, err := io.ReadFull(resultBody, buff)
+		if err != nil && err != io.ErrUnexpectedEOF && err != io.EOF {
+			syslogs.Error("下载附件出错了:", err)
+			c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
+			return
+		}
+		if n <= 0 {
+			break
+		}
+		bbuf.Write(buff[:n])
+		ssize += int64(n)
+	}
+
+	c.Ctx.Header("Content-Length", strconv.FormatInt(ssize, 10))
+	_, err = c.Ctx.Writer.Write(bbuf.Bytes())
+	if err != nil {
+		syslogs.Error("输出流断开:", attach.Name, attach.Size)
+		c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
+		return
 	}
+
+	syslogs.Debug("下载附件成功:", attach.Name, attach.Size)
+	c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attach.Id})
 }
 
 // _Delete
@@ -50,17 +101,45 @@ func SysAttachment_Download(c *entitys.CtrlContext) {
 // @Success 200 {object} Account
 // @Failure 403 :id is empty
 func SysAttachment_Delete(c *entitys.CtrlContext) {
-	id := c.Ctx.Query("id")
-
-	ret := __none_func_sys_attachment__(id)
-	if ret {
-		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
-	}else{
-		c.Ctx.JSON(500, sysmodel.SysReturn{500, "", nil})
+	attrId := c.Ctx.Query("id")
+	attach := &sysmodel.SysAttachment{}
+	attach.Id = attrId
+	_, err := c.Db.Id(attrId).Delete(attach)
+	if err != nil {
+		syslogs.Error("删除附件出错了:", err)
+		c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
+		return
 	}
+	syslogs.Debug("删除附件:", attrId)
+	c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attrId})
 }
 
+func doUpload(c *entitys.CtrlContext) (*sysmodel.SysAttachment, error) {
+	file, fInfo, err := c.Ctx.Request.FormFile("file")
+	if err != nil {
+		syslogs.Error("上传出错了:", err)
+		return nil, err
+	}
+	download, hash, length, err := sysutils.PostFile(file)
+
+	attach := &sysmodel.SysAttachment{}
+	attach.Id = sysutils.NewUUID()
+	attach.Name = fInfo.Filename
+	attach.Size = length
+	attach.Url = download
+	attach.CreateTime = time.Now()
+	attach.Ext = path.Ext(attach.Name)
+	attach.Hash = hash
+
+	_, err = c.Db.InsertOne(attach)
+	if err != nil {
+		syslogs.Error("保存附件出错了:", err)
+		return nil, err
+	}
+
+	return attach, nil
+}
 
-func __none_func_sys_attachment__(params ... interface{}) bool{
+func __none_func_sys_attachment__(params ... interface{}) bool {
 	return true
 }