Add new feature of image cache.
This commit is contained in:
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -24,3 +24,4 @@ func (this *ImageCacheService) Detail(uuid string) *ImageCache {
|
||||
|
||||
return imageCache
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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+"\"")
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user