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 }