| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- package partial
- import (
- "io"
- "os"
- "fmt"
- "path"
- "mime"
- "time"
- "strconv"
- "io/ioutil"
- "crypto/sha1"
- "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
- syslogs "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs"
- sysutils "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
- sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
- )
- // _Upload
- // @Title _Upload
- // @Description 上传文件
- // @Success 200 {object} Account
- // @Failure 403 :id is empty
- func SysAttachment_Upload(c *entitys.CtrlContext) {
- attach, err := doUpload2(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 engine = c.PlatformDbEngine
- var attach sysmodel.SysAttachment
- has, err := engine.ID(attrId).Get(&attach)
- if err != nil || !has {
- syslogs.Error("获取附件出错了:", err)
- c.Ctx.JSON(500, sysmodel.SysReturn{500, "获取附件出错了", nil})
- return
- }
- filePath := "files/" + attach.Id
- c.Ctx.Writer.Header().Add("Content-Disposition", "attachment;filename=\""+sysutils.FormatForBrowse(c.Ctx.Request.UserAgent(), attach.Name)+"\"")
- c.Ctx.Writer.Header().Add("Content-Type", mime.TypeByExtension(attach.Ext))
- c.Ctx.Writer.Header().Add("Content-Length", strconv.FormatInt(int64(attach.Size), 10))
- c.Ctx.Writer.Header().Add("Accept-Ranges", "bytes")
- if !sysutils.Exists(filePath) {
- c.Ctx.Writer.WriteHeader(400)
- return
- }
- fmt.Println("---->", c.Ctx.Writer.Header().Get("Content-Disposition"))
- fmt.Println("---->", c.Ctx.Writer.Header().Get("Content-Type"))
- fmt.Println("---->", c.Ctx.Writer.Header().Get("Content-Length"))
- fmt.Println("---->", c.Ctx.Writer.Header().Get("Accept-Ranges"))
- c.Ctx.File(filePath)
- /*attrId := c.Ctx.Query("id")
- //c.Ctx.Writer.WriteHeader(200)
- /*attrId := c.Ctx.Query("id")
- filePath := fmt.Sprintf("files/%s", attrId)
- c.Ctx.Header("Content-Type", "image/png")
- c.Ctx.Header("Content-Disposition", fmt.Sprintf("inline; filename=\"%s\"", attrId))
- file, err := ioutil.ReadFile(filePath)
- if err != nil {
- c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
- return
- }
- c.Ctx.Writer.Write(file)*/
- ////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
- //}
- //
- ////domain := c.Ctx.GetString("domain")
- ////filePath := fmt.Sprintf("files/%s/%s", domain, attrId)
- //filePath := fmt.Sprintf("files/%s", attrId)
- //file, err := os.Open(filePath)
- //if err != nil {
- // c.Ctx.JSON(500, sysmodel.SysReturn{500, err.Error(), nil})
- // return
- //}
- //defer file.Close()
- //
- ///*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))
- //c.Ctx.Header("Content-Type", "image/jpeg")
- //
- //buff := make([]byte, 1024)
- //var ssize int64 = 0
- //
- //for {
- // n, err := io.ReadFull(file, 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.PlatformDbEngine.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})
- }
- // _Get
- // @Title _Get
- // @Description 获取附件信息
- // @Param id string false "附件id"
- // @Success 200 {object} Account
- // @Failure 403 :id is empty
- func SysAttachment_Get(c *entitys.CtrlContext) {
- var id = c.Ctx.Query("id")
- var attach sysmodel.SysAttachment
- has, err := c.PlatformDbEngine.ID(id).Get(&attach)
- if err == nil {
- if has {
- c.Ctx.JSON(200, sysmodel.SysReturn{200, "", attach})
- } else {
- c.Ctx.JSON(200, sysmodel.SysReturn{500, "附件不存在", nil})
- }
- } else {
- c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
- }
- }
- 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
- }
- userId := c.Ctx.GetString("user_id")
- attach := &sysmodel.SysAttachment{}
- attach.Id = sysutils.NewUUID()
- attach.Name = fInfo.Filename
- attach.Size = length
- attach.Url = download
- attach.CreateBy = userId
- 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 doUpload2(c *entitys.CtrlContext) (*sysmodel.SysAttachment, error) {
- file, fInfo, err := c.Ctx.Request.FormFile("file")
- if err != nil {
- syslogs.Error("上传出错了:", err)
- return nil, err
- }
- defer file.Close()
- //domain := c.Ctx.GetString("domain")
- //fileDir := fmt.Sprintf("files/%s/", domain)
- fileDir := fmt.Sprintf("files/")
- if err = mkdir(fileDir); err != nil {
- syslogs.Info("文件夹创建失败")
- return nil, err
- }
- attachId := sysutils.NewUUID()
- filePath := fileDir + attachId
- fW, err := os.Create(filePath)
- if err != nil {
- syslogs.Info("文件创建失败")
- return nil, err
- }
- defer fW.Close()
- length, err := io.Copy(fW, file)
- if err != nil {
- syslogs.Info("文件保存失败")
- return nil, err
- }
- userId := c.Ctx.GetString("user_id")
- attach := &sysmodel.SysAttachment{}
- attach.Id = attachId
- attach.Name = fInfo.Filename
- attach.Size = int32(length)
- attach.Url = "/api/v1/sys_attachment/download?id=" + attach.Id
- attach.CreateBy = userId
- attach.CreateTime = time.Now()
- attach.Ext = path.Ext(attach.Name)
- attach.Hash = FileHasH(filePath)
- //_, err = c.Db.InsertOne(attach)
- _, err = c.PlatformDbEngine.InsertOne(attach)
- if err != nil {
- syslogs.Error("保存附件出错了:", err)
- return nil, err
- }
- return attach, nil
- }
- func mkdir(dir string) error {
- _, err := os.Stat(dir)
- if err != nil {
- err = os.MkdirAll(dir, os.ModePerm)
- }
- return err
- }
- func FileHasH(filePath string) string {
- bytes, err := ioutil.ReadFile(filePath)
- if err == nil && len(bytes) > 0 {
- return fmt.Sprintf("%x", sha1.Sum(bytes))
- }
- return ""
- }
- func __none_func_sys_attachment__(params ...interface{}) bool {
- return true
- }
|