| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- package partial
- import (
- sysmodel "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) {
- attach, err := doUpload(c)
- if err == nil {
- c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attach.Id})
- syslogs.Debug("上传附件成功:", attach.Name, attach.Size)
- } else {
- c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
- }
- }
- // _Download
- // @Title _Download
- // @Description 下载文件
- // @Param id string false "文件ID"
- // @Success 200 {object} Account
- // @Failure 403 :id is empty
- func SysAttachment_Download(c *entitys.CtrlContext) {
- 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))
- 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
- // @Title _Delete
- // @Description 删除文件
- // @Param id string false "文件ID"
- // @Success 200 {object} Account
- // @Failure 403 :id is empty
- func SysAttachment_Delete(c *entitys.CtrlContext) {
- 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)
- if err != nil {
- return nil, err
- }
- 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 {
- return true
- }
|