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" "crypto/sha1" "io/ioutil" "strconv" "strings" "errors" "bytes" "path" "mime" "time" "fmt" "io" "os" ) // _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 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, attach.Id) 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)) 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.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 } 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) 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) 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 }