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 }