From 6c19a3d3211f12e57b1d5ee9f0bb904dcd2ce217 Mon Sep 17 00:00:00 2001 From: zicla Date: Thu, 22 Nov 2018 23:18:36 +0800 Subject: [PATCH] Add new feature of image cache. --- rest/alien_controller.go | 48 +++++++++++--- rest/image_cache_service.go | 1 + rest/install.go | 12 ++-- rest/matter_service.go | 126 ++++++++++++++++++++---------------- rest/util_path.go | 10 ++- 5 files changed, 123 insertions(+), 74 deletions(-) diff --git a/rest/alien_controller.go b/rest/alien_controller.go index 322a3dd..5d6bbdd 100644 --- a/rest/alien_controller.go +++ b/rest/alien_controller.go @@ -3,10 +3,11 @@ package rest import ( "fmt" "net/http" + "os" "regexp" "strconv" - "time" "strings" + "time" ) type AlienController struct { @@ -435,17 +436,48 @@ func (this *AlienController) Download(writer http.ResponseWriter, request *http. } } - //缓存 - var uri string = request.RequestURI - //this.imageCacheDao.FindByUri(uri) - fmt.Printf(uri) - //对图片做缩放处理。 imageProcess := request.FormValue("imageProcess") if imageProcess == "resize" { - this.matterService.ResizeImage(writer, request, matter) + + //如果是图片,那么能用缓存就用缓存 + uri := request.RequestURI + imageCache := this.imageCacheDao.FindByUri(uri) + if imageCache != nil { + + //直接使用缓存中的信息 + this.matterService.DownloadFile(writer, request, CONFIG.MatterPath+imageCache.Path, matter.Name) + + } else { + + //resize图片 + dstImage := this.matterService.ResizeImage(request, CONFIG.MatterPath+matter.Path) + + user := this.userDao.FindByUuid(matter.UserUuid) + //获取文件应该存放在的物理路径的绝对路径和相对路径。 + absolutePath, relativePath := GetUserFilePath(user.Username, true) + absolutePath = absolutePath + "/" + filename + relativePath = relativePath + "/" + filename + + fileWriter, err := os.Create(absolutePath) + this.PanicError(err) + defer fileWriter.Close() + + //生成的图片输出到两个writer中去 + this.matterService.DownloadImage(writer, fileWriter, dstImage, matter.Name) + + //相关信息写到缓存中去 + imageCache = &ImageCache{ + UserUuid: matter.UserUuid, + MatterUuid: matter.Uuid, + Uri: uri, + Path: relativePath, + } + this.imageCacheDao.Create(imageCache) + } + } else { - this.matterService.DownloadFile(writer, request, matter) + this.matterService.DownloadFile(writer, request, CONFIG.MatterPath+matter.Path, matter.Name) } } diff --git a/rest/image_cache_service.go b/rest/image_cache_service.go index 3740c38..e1cbb10 100644 --- a/rest/image_cache_service.go +++ b/rest/image_cache_service.go @@ -24,3 +24,4 @@ func (this *ImageCacheService) Detail(uuid string) *ImageCache { return imageCache } + diff --git a/rest/install.go b/rest/install.go index 903d8d9..f524c94 100644 --- a/rest/install.go +++ b/rest/install.go @@ -25,7 +25,7 @@ func InstallDatabase() { hasTable = db.HasTable(downloadToken) if !hasTable { - createDownloadToken := "CREATE TABLE `tank10_download_token` (`uuid` char(36) NOT NULL,`user_uuid` char(36) DEFAULT NULL COMMENT '用户uuid',`matter_uuid` char(36) DEFAULT NULL COMMENT '文件标识',`expire_time` timestamp NULL DEFAULT NULL COMMENT '授权访问的次数',`ip` varchar(45) DEFAULT NULL COMMENT '消费者的ip',`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='下载的token表';" + createDownloadToken := "CREATE TABLE `tank20_download_token` (`uuid` char(36) NOT NULL,`user_uuid` char(36) DEFAULT NULL COMMENT '用户uuid',`matter_uuid` char(36) DEFAULT NULL COMMENT '文件标识',`expire_time` timestamp NULL DEFAULT NULL COMMENT '授权访问的次数',`ip` varchar(45) DEFAULT NULL COMMENT '消费者的ip',`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='下载的token表';" db = db.Exec(createDownloadToken) if db.Error != nil { LogPanic(db.Error) @@ -37,7 +37,7 @@ func InstallDatabase() { matter := &Matter{} hasTable = db.HasTable(matter) if !hasTable { - createMatter := "CREATE TABLE `tank10_matter` (`uuid` char(36) NOT NULL,`puuid` varchar(45) DEFAULT NULL COMMENT '上一级的uuid',`user_uuid` char(36) DEFAULT NULL COMMENT '上传的用户id',`dir` tinyint(1) DEFAULT '0' COMMENT '是否是文件夹',`alien` tinyint(1) DEFAULT '0',`name` varchar(255) DEFAULT NULL COMMENT '文件名称',`md5` varchar(45) DEFAULT NULL COMMENT '文件的md5值',`size` bigint(20) DEFAULT '0' COMMENT '文件大小',`privacy` tinyint(1) DEFAULT '0' COMMENT '文件是否是公有的',`path` varchar(255) DEFAULT NULL,`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='file表';" + createMatter := "CREATE TABLE `tank20_matter` (`uuid` char(36) NOT NULL,`puuid` varchar(45) DEFAULT NULL COMMENT '上一级的uuid',`user_uuid` char(36) DEFAULT NULL COMMENT '上传的用户id',`dir` tinyint(1) DEFAULT '0' COMMENT '是否是文件夹',`alien` tinyint(1) DEFAULT '0',`name` varchar(255) DEFAULT NULL COMMENT '文件名称',`md5` varchar(45) DEFAULT NULL COMMENT '文件的md5值',`size` bigint(20) DEFAULT '0' COMMENT '文件大小',`privacy` tinyint(1) DEFAULT '0' COMMENT '文件是否是公有的',`path` varchar(255) DEFAULT NULL,`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='file表';" db = db.Exec(createMatter) if db.Error != nil { LogPanic(db.Error) @@ -49,7 +49,7 @@ func InstallDatabase() { preference := &Preference{} hasTable = db.HasTable(preference) if !hasTable { - createPreference := "CREATE TABLE `tank10_preference` (`uuid` char(36) NOT NULL,`name` varchar(45) DEFAULT NULL COMMENT '网站名称',`logo_url` varchar(255) DEFAULT NULL,`favicon_url` varchar(255) DEFAULT NULL,`footer_line1` varchar(1024) DEFAULT NULL,`footer_line2` varchar(1024) DEFAULT NULL,`version` varchar(45) DEFAULT NULL,`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网站偏好设置表';" + createPreference := "CREATE TABLE `tank20_preference` (`uuid` char(36) NOT NULL,`name` varchar(45) DEFAULT NULL COMMENT '网站名称',`logo_url` varchar(255) DEFAULT NULL,`favicon_url` varchar(255) DEFAULT NULL,`footer_line1` varchar(1024) DEFAULT NULL,`footer_line2` varchar(1024) DEFAULT NULL,`version` varchar(45) DEFAULT NULL,`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网站偏好设置表';" db = db.Exec(createPreference) if db.Error != nil { LogPanic(db.Error) @@ -61,7 +61,7 @@ func InstallDatabase() { hasTable = db.HasTable(session) if !hasTable { - createSession := "CREATE TABLE `tank10_session` (`uuid` char(36) NOT NULL,`authentication` char(36) DEFAULT NULL COMMENT '认证身份,存放在cookie中',`user_uuid` char(36) DEFAULT NULL COMMENT '用户uuid',`ip` varchar(45) DEFAULT NULL COMMENT '用户的ip地址',`expire_time` timestamp NULL DEFAULT NULL,`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='session表';" + createSession := "CREATE TABLE `tank20_session` (`uuid` char(36) NOT NULL,`authentication` char(36) DEFAULT NULL COMMENT '认证身份,存放在cookie中',`user_uuid` char(36) DEFAULT NULL COMMENT '用户uuid',`ip` varchar(45) DEFAULT NULL COMMENT '用户的ip地址',`expire_time` timestamp NULL DEFAULT NULL,`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='session表';" db = db.Exec(createSession) if db.Error != nil { LogPanic(db.Error) @@ -73,7 +73,7 @@ func InstallDatabase() { hasTable = db.HasTable(uploadToken) if !hasTable { - createUploadToken := "CREATE TABLE `tank10_upload_token` (`uuid` char(36) NOT NULL,`user_uuid` char(36) DEFAULT NULL COMMENT '用户uuid',`folder_uuid` char(36) DEFAULT NULL,`matter_uuid` char(36) DEFAULT NULL,`filename` varchar(255) DEFAULT NULL COMMENT '文件后缀名的过滤,可以只允许用户上传特定格式的文件。',`privacy` tinyint(1) DEFAULT '1',`size` bigint(20) DEFAULT '0',`expire_time` timestamp NULL DEFAULT NULL,`ip` varchar(45) DEFAULT NULL COMMENT '消费者的ip',`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='上传的token表';" + createUploadToken := "CREATE TABLE `tank20_upload_token` (`uuid` char(36) NOT NULL,`user_uuid` char(36) DEFAULT NULL COMMENT '用户uuid',`folder_uuid` char(36) DEFAULT NULL,`matter_uuid` char(36) DEFAULT NULL,`filename` varchar(255) DEFAULT NULL COMMENT '文件后缀名的过滤,可以只允许用户上传特定格式的文件。',`privacy` tinyint(1) DEFAULT '1',`size` bigint(20) DEFAULT '0',`expire_time` timestamp NULL DEFAULT NULL,`ip` varchar(45) DEFAULT NULL COMMENT '消费者的ip',`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='上传的token表';" db = db.Exec(createUploadToken) if db.Error != nil { LogPanic(db.Error) @@ -98,7 +98,7 @@ func InstallDatabase() { LogPanic("超级管理员邮箱必填!") } - createUser := "CREATE TABLE `tank10_user` (`uuid` char(36) NOT NULL,`role` varchar(45) DEFAULT 'USER',`username` varchar(255) DEFAULT NULL COMMENT '昵称',`password` varchar(255) DEFAULT NULL COMMENT '密码',`email` varchar(45) DEFAULT NULL COMMENT '邮箱',`phone` varchar(45) DEFAULT NULL COMMENT '电话',`gender` varchar(45) DEFAULT 'UNKNOWN' COMMENT '性别,默认未知',`city` varchar(45) DEFAULT NULL COMMENT '城市',`avatar_url` varchar(255) DEFAULT NULL COMMENT '头像链接',`last_time` datetime DEFAULT NULL COMMENT '上次登录使劲按',`last_ip` varchar(45) DEFAULT NULL,`size_limit` int(11) DEFAULT '-1' COMMENT '该账号上传文件的大小限制,单位byte。<0 表示不设限制',`status` varchar(45) DEFAULT 'OK',`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表描述';" + createUser := "CREATE TABLE `tank20_user` (`uuid` char(36) NOT NULL,`role` varchar(45) DEFAULT 'USER',`username` varchar(255) DEFAULT NULL COMMENT '昵称',`password` varchar(255) DEFAULT NULL COMMENT '密码',`email` varchar(45) DEFAULT NULL COMMENT '邮箱',`phone` varchar(45) DEFAULT NULL COMMENT '电话',`gender` varchar(45) DEFAULT 'UNKNOWN' COMMENT '性别,默认未知',`city` varchar(45) DEFAULT NULL COMMENT '城市',`avatar_url` varchar(255) DEFAULT NULL COMMENT '头像链接',`last_time` datetime DEFAULT NULL COMMENT '上次登录使劲按',`last_ip` varchar(45) DEFAULT NULL,`size_limit` int(11) DEFAULT '-1' COMMENT '该账号上传文件的大小限制,单位byte。<0 表示不设限制',`status` varchar(45) DEFAULT 'OK',`sort` bigint(20) DEFAULT NULL,`modify_time` timestamp NULL DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`uuid`),UNIQUE KEY `id_UNIQUE` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表描述';" db = db.Exec(createUser) if db.Error != nil { LogPanic(db.Error) diff --git a/rest/matter_service.go b/rest/matter_service.go index 8f1ce5d..99aaaa4 100644 --- a/rest/matter_service.go +++ b/rest/matter_service.go @@ -1,39 +1,45 @@ package rest import ( - "io" - "mime/multipart" - "os" - "regexp" - "strings" - "net/http" - "github.com/disintegration/imaging" - "strconv" - "mime" - "path/filepath" - "net/url" "errors" - "time" "fmt" + "github.com/disintegration/imaging" + "image" + "io" + "mime" + "mime/multipart" + "net/http" "net/textproto" + "net/url" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" + "time" ) //@Service type MatterService struct { Bean matterDao *MatterDao + userDao *UserDao } //初始化方法 func (this *MatterService) Init(context *Context) { //手动装填本实例的Bean. 这里必须要用中间变量方可。 - b := context.GetBean(this.matterDao) if b, ok := b.(*MatterDao); ok { this.matterDao = b } + b = context.GetBean(this.userDao) + if b, ok := b.(*UserDao); ok { + this.userDao = b + } + } //根据一个文件夹路径,找到最后一个文件夹的uuid,如果中途出错,返回err. @@ -122,7 +128,7 @@ func (this *MatterService) Upload(file multipart.File, user *User, puuid string, } //获取文件应该存放在的物理路径的绝对路径和相对路径。 - absolutePath, relativePath := GetUserFilePath(user.Username) + absolutePath, relativePath := GetUserFilePath(user.Username, false) absolutePath = absolutePath + "/" + filename relativePath = relativePath + "/" + filename @@ -201,7 +207,7 @@ func (this *MatterService) Crawl(url string, filename string, user *User, puuid } //获取文件应该存放在的物理路径的绝对路径和相对路径。 - absolutePath, relativePath := GetUserFilePath(user.Username) + absolutePath, relativePath := GetUserFilePath(user.Username, false) absolutePath = absolutePath + "/" + filename relativePath = relativePath + "/" + filename @@ -243,34 +249,12 @@ func (this *MatterService) Crawl(url string, filename string, user *User, puuid } //图片预处理功能。 -func (this *MatterService) ResizeImage(writer http.ResponseWriter, request *http.Request, matter *Matter) { +func (this *MatterService) ResizeImage(request *http.Request, filePath string) *image.NRGBA { - diskFile, err := os.Open(CONFIG.MatterPath + matter.Path) + diskFile, err := os.Open(filePath) this.PanicError(err) defer diskFile.Close() - // 防止中文乱码 - fileName := url.QueryEscape(matter.Name) - mimeType := GetMimeType(fileName) - writer.Header().Set("Content-Type", mimeType) - - //当前的文件是否是图片,只有图片才能处理。 - extension := GetExtension(matter.Name) - formats := map[string]imaging.Format{ - ".jpg": imaging.JPEG, - ".jpeg": imaging.JPEG, - ".png": imaging.PNG, - ".tif": imaging.TIFF, - ".tiff": imaging.TIFF, - ".bmp": imaging.BMP, - ".gif": imaging.GIF, - } - - format, ok := formats[extension] - if !ok { - panic("该图片格式不支持处理") - } - imageResizeM := request.FormValue("imageResizeM") if imageResizeM == "" { imageResizeM = "fit" @@ -302,19 +286,14 @@ func (this *MatterService) ResizeImage(writer http.ResponseWriter, request *http if imageResizeW > 0 { src, err := imaging.Decode(diskFile) this.PanicError(err) - dst := imaging.Resize(src, imageResizeW, 0, imaging.Lanczos) + return imaging.Resize(src, imageResizeW, 0, imaging.Lanczos) - err = imaging.Encode(writer, dst, format) - this.PanicError(err) } else if imageResizeH > 0 { //将图缩略成高度为100,宽度按比例处理。 src, err := imaging.Decode(diskFile) this.PanicError(err) - dst := imaging.Resize(src, 0, imageResizeH, imaging.Lanczos) + return imaging.Resize(src, 0, imageResizeH, imaging.Lanczos) - err = imaging.Encode(writer, dst, format) - - this.PanicError(err) } else { panic("单边缩略必须指定imageResizeW或imageResizeH") } @@ -323,9 +302,8 @@ func (this *MatterService) ResizeImage(writer http.ResponseWriter, request *http if imageResizeW > 0 && imageResizeH > 0 { src, err := imaging.Decode(diskFile) this.PanicError(err) - dst := imaging.Fill(src, imageResizeW, imageResizeH, imaging.Center, imaging.Lanczos) - err = imaging.Encode(writer, dst, format) - this.PanicError(err) + return imaging.Fill(src, imageResizeW, imageResizeH, imaging.Center, imaging.Lanczos) + } else { panic("固定宽高,自动裁剪 必须同时指定imageResizeW和imageResizeH") } @@ -334,15 +312,47 @@ func (this *MatterService) ResizeImage(writer http.ResponseWriter, request *http if imageResizeW > 0 && imageResizeH > 0 { src, err := imaging.Decode(diskFile) this.PanicError(err) - dst := imaging.Resize(src, imageResizeW, imageResizeH, imaging.Lanczos) + return imaging.Resize(src, imageResizeW, imageResizeH, imaging.Lanczos) - err = imaging.Encode(writer, dst, format) - this.PanicError(err) } else { panic("强制宽高缩略必须同时指定imageResizeW和imageResizeH") } + } else { + panic("不支持" + imageResizeM + "处理模式") + } +} + +//下载处理后的图片 +func (this *MatterService) DownloadImage(writer http.ResponseWriter, fileWriter io.Writer, dstImage *image.NRGBA, filename string) { + + // 防止中文乱码 + fileName := url.QueryEscape(filename) + mimeType := GetMimeType(fileName) + writer.Header().Set("Content-Type", mimeType) + + //当前的文件是否是图片,只有图片才能处理。 + extension := GetExtension(filename) + formats := map[string]imaging.Format{ + ".jpg": imaging.JPEG, + ".jpeg": imaging.JPEG, + ".png": imaging.PNG, + ".tif": imaging.TIFF, + ".tiff": imaging.TIFF, + ".bmp": imaging.BMP, + ".gif": imaging.GIF, } + format, ok := formats[extension] + if !ok { + panic("该图片格式不支持处理") + } + + err := imaging.Encode(writer, dstImage, format) + this.PanicError(err) + + //处理后的图片存放在本地 + err = imaging.Encode(fileWriter, dstImage, format) + this.PanicError(err) } // httpRange specifies the byte range to be sent to the client. @@ -529,18 +539,20 @@ func (this *MatterService) sumRangesSize(ranges []httpRange) (size int64) { return } -//文件下载功能。 +//文件下载。具有进度功能。 //下载功能参考:https://github.com/Masterminds/go-fileserver -func (this *MatterService) DownloadFile(writer http.ResponseWriter, request *http.Request, matter *Matter) { +func (this *MatterService) DownloadFile(writer http.ResponseWriter, request *http.Request, filePath string, filename string) { - diskFile, err := os.Open(CONFIG.MatterPath + matter.Path) + diskFile, err := os.Open(filePath) this.PanicError(err) defer diskFile.Close() //如果是图片或者文本或者视频就直接打开。其余的一律以下载形式返回。 - fileName := url.QueryEscape(matter.Name) + fileName := url.QueryEscape(filename) mimeType := GetMimeType(fileName) - if strings.Index(mimeType, "image") != 0 && strings.Index(mimeType, "text") != 0 && strings.Index(mimeType, "video") != 0 { + if strings.Index(mimeType, "image") != 0 && + strings.Index(mimeType, "text") != 0 && + strings.Index(mimeType, "video") != 0 { writer.Header().Set("content-disposition", "attachment; filename=\""+fileName+"\"") } diff --git a/rest/util_path.go b/rest/util_path.go index a47dd60..6fa271f 100644 --- a/rest/util_path.go +++ b/rest/util_path.go @@ -3,8 +3,8 @@ package rest import ( "fmt" "os" - "time" "path/filepath" + "time" ) //判断文件或文件夹是否已经存在 @@ -89,13 +89,17 @@ func GetConfPath() string { //获取某个用户文件应该存放的位置。这个是相对GetFilePath的路径 //例如:/zicla/2006-01-02/1510122428000 -func GetUserFilePath(username string) (string, string) { +func GetUserFilePath(username string, cache bool) (string, string) { now := time.Now() datePath := now.Format("2006-01-02") //毫秒时间戳 timestamp := now.UnixNano() / 1e6 - + + //如果是缓存文件夹,那么统一放在cache这个文件夹下面 + if cache { + datePath = fmt.Sprintf("cache/%s", datePath) + } filePath := CONFIG.MatterPath absolutePath := fmt.Sprintf("%s/%s/%s/%d", filePath, username, datePath, timestamp) relativePath := fmt.Sprintf("/%s/%s/%d", username, datePath, timestamp)