Files
leanote/app/controllers/FileController.go

294 lines
7.0 KiB
Go
Raw Normal View History

2014-05-07 13:06:24 +08:00
package controllers
import (
"github.com/revel/revel"
2015-11-13 17:58:41 +08:00
// "encoding/json"
"fmt"
"github.com/leanote/leanote/app/info"
2014-05-07 13:06:24 +08:00
. "github.com/leanote/leanote/app/lea"
2014-10-22 16:20:45 +08:00
"github.com/leanote/leanote/app/lea/netutil"
2015-11-13 17:58:41 +08:00
"gopkg.in/mgo.v2/bson"
2014-05-07 13:06:24 +08:00
"io/ioutil"
"os"
2015-11-13 17:58:41 +08:00
// "strconv"
2014-09-19 17:18:53 +08:00
"strings"
2014-05-07 13:06:24 +08:00
)
// 首页
type File struct {
BaseController
}
2014-09-21 22:52:37 +08:00
// 上传的是博客logo
// TODO logo不要设置权限, 另外的目录
func (c File) UploadBlogLogo() revel.Result {
2015-11-13 17:58:41 +08:00
re := c.uploadImage("blogLogo", "")
c.ViewArgs["fileUrlPath"] = re.Id
c.ViewArgs["resultCode"] = re.Code
c.ViewArgs["resultMsg"] = re.Msg
2014-05-07 13:06:24 +08:00
2014-09-21 22:52:37 +08:00
return c.RenderTemplate("file/blog_logo.html")
2014-05-07 13:06:24 +08:00
}
2014-09-21 00:29:46 +08:00
// 拖拉上传, pasteImage
// noteId 是为了判断是否是协作的note, 如果是则需要复制一份到note owner中
func (c File) PasteImage(noteId string) revel.Result {
2015-11-13 17:58:41 +08:00
re := c.uploadImage("pasteImage", "")
2015-11-28 17:58:38 +08:00
if noteId != "" {
userId := c.GetUserId()
note := noteService.GetNoteById(noteId)
if note.UserId != "" {
noteUserId := note.UserId.Hex()
if noteUserId != userId {
// 是否是有权限协作的
if shareService.HasUpdatePerm(noteUserId, userId, noteId) {
// 复制图片之, 图片复制给noteUserId
_, re.Id = fileService.CopyImage(userId, re.Id, noteUserId)
} else {
// 怎么可能在这个笔记下paste图片呢?
// 正常情况下不会
}
2014-09-21 00:29:46 +08:00
}
}
}
2015-11-13 17:58:41 +08:00
return c.RenderJSON(re)
2014-09-21 00:29:46 +08:00
}
2014-10-22 16:20:45 +08:00
// 头像设置
func (c File) UploadAvatar() revel.Result {
2015-11-13 17:58:41 +08:00
re := c.uploadImage("logo", "")
c.ViewArgs["fileUrlPath"] = re.Id
c.ViewArgs["resultCode"] = re.Code
c.ViewArgs["resultMsg"] = re.Msg
2015-11-13 17:58:41 +08:00
2014-10-22 16:20:45 +08:00
if re.Ok {
re.Ok = userService.UpdateAvatar(c.GetUserId(), re.Id)
if re.Ok {
2015-11-13 17:58:41 +08:00
c.UpdateSession("Logo", re.Id)
2014-10-22 16:20:45 +08:00
}
}
return c.RenderJSON(re)
2014-10-22 16:20:45 +08:00
}
2014-09-21 22:05:04 +08:00
// leaui image plugin upload image
func (c File) UploadImageLeaui(albumId string) revel.Result {
re := c.uploadImage("", albumId)
return c.RenderJSON(re)
2014-05-07 13:06:24 +08:00
}
// 上传图片, 公用方法
2014-09-21 22:05:04 +08:00
// upload image common func
func (c File) uploadImage(from, albumId string) (re info.Re) {
2014-05-07 13:06:24 +08:00
var fileUrlPath = ""
2014-09-19 17:18:53 +08:00
var fileId = ""
var resultCode = 0 // 1表示正常
var resultMsg = "error" // 错误信息
2014-06-08 17:57:19 +08:00
var Ok = false
2014-05-07 13:06:24 +08:00
defer func() {
2014-09-21 00:29:46 +08:00
re.Id = fileId // 只是id, 没有其它信息
2014-05-07 13:06:24 +08:00
re.Code = resultCode
re.Msg = resultMsg
2014-06-08 17:57:19 +08:00
re.Ok = Ok
2014-05-07 13:06:24 +08:00
}()
2017-11-30 18:10:59 +08:00
// file, handel, err := c.Request.FormFile("file")
// if err != nil {
// return re
// }
// defer file.Close()
var data []byte
c.Params.Bind(&data, "file")
handel := c.Params.Files["file"][0]
if data == nil || len(data) == 0 {
2014-05-07 13:06:24 +08:00
return re
}
2017-11-30 18:10:59 +08:00
// file, handel, err := c.Request.FormFile("file")
// if err != nil {
// return re
// }
// defer file.Close()
// data, err := ioutil.ReadAll(file)
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 生成上传路径
newGuid := NewGuid()
2015-11-13 17:58:41 +08:00
userId := c.GetUserId()
2015-11-13 17:58:41 +08:00
if from == "logo" || from == "blogLogo" {
fileUrlPath = "public/upload/" + Digest3(userId) + "/" + userId + "/images/logo"
2014-09-21 22:52:37 +08:00
} else {
// fileUrlPath = "files/" + Digest3(userId) + "/" + userId + "/" + Digest2(newGuid) + "/images"
fileUrlPath = "files/" + GetRandomFilePath(userId, newGuid) + "/images"
2014-09-21 22:52:37 +08:00
}
dir := revel.BasePath + "/" + fileUrlPath
2017-11-30 18:10:59 +08:00
err := os.MkdirAll(dir, 0755)
2014-05-07 13:06:24 +08:00
if err != nil {
return re
}
// 生成新的文件名
filename := handel.Filename
var ext string
2014-06-08 17:57:19 +08:00
if from == "pasteImage" {
2015-11-28 21:47:50 +08:00
handel.Filename = c.Message("unTitled")
ext = ".png" // TODO 可能不是png类型
2014-06-08 17:57:19 +08:00
} else {
_, ext = SplitFilename(filename)
if ext != ".gif" && ext != ".jpg" && ext != ".png" && ext != ".bmp" && ext != ".jpeg" {
resultMsg = "Please upload image"
2014-06-08 17:57:19 +08:00
return re
}
2014-05-07 13:06:24 +08:00
}
2014-06-08 17:57:19 +08:00
filename = newGuid + ext
2017-11-30 18:10:59 +08:00
// data, err := ioutil.ReadAll(file)
// if err != nil {
// LogJ(err)
// return re
// }
2014-11-09 18:00:23 +08:00
var maxFileSize float64
if from == "logo" {
maxFileSize = configService.GetUploadSize("uploadAvatarSize")
2014-11-09 18:00:23 +08:00
} else if from == "blogLogo" {
maxFileSize = configService.GetUploadSize("uploadBlogLogoSize")
2014-11-09 18:00:23 +08:00
} else {
maxFileSize = configService.GetUploadSize("uploadImageSize")
2014-11-09 18:00:23 +08:00
}
if maxFileSize <= 0 {
maxFileSize = 1000
}
2014-05-07 13:06:24 +08:00
// > 2M?
if float64(len(data)) > maxFileSize*float64(1024*1024) {
2014-05-07 13:06:24 +08:00
resultCode = 0
resultMsg = fmt.Sprintf("The file Size is bigger than %vM", maxFileSize)
2014-05-07 13:06:24 +08:00
return re
}
toPath := dir + "/" + filename
2014-05-07 13:06:24 +08:00
err = ioutil.WriteFile(toPath, data, 0777)
if err != nil {
LogJ(err)
return re
}
// 改变成gif图片
_, toPathGif := TransToGif(toPath, 0, true)
filename = GetFilename(toPathGif)
filesize := GetFilesize(toPathGif)
fileUrlPath += "/" + filename
2014-05-07 13:06:24 +08:00
resultCode = 1
resultMsg = "Upload Success!"
// File
fileInfo := info.File{Name: filename,
2014-06-28 23:12:34 +08:00
Title: handel.Filename,
Path: fileUrlPath,
Size: filesize}
id := bson.NewObjectId()
2014-09-19 17:18:53 +08:00
fileInfo.FileId = id
fileId = id.Hex()
2015-11-13 17:58:41 +08:00
if from == "logo" || from == "blogLogo" {
fileId = fileUrlPath
2014-09-21 22:52:37 +08:00
}
Ok, resultMsg = fileService.AddImage(fileInfo, albumId, c.GetUserId(), from == "" || from == "pasteImage")
resultMsg = c.Message(resultMsg)
fileInfo.Path = "" // 不要返回
re.Item = fileInfo
2014-05-07 13:06:24 +08:00
return re
}
// get all images by userId with page
func (c File) GetImages(albumId, key string, page int) revel.Result {
re := fileService.ListImagesWithPage(c.GetUserId(), albumId, key, page, 12)
return c.RenderJSON(re)
}
func (c File) UpdateImageTitle(fileId, title string) revel.Result {
re := info.NewRe()
re.Ok = fileService.UpdateImageTitle(c.GetUserId(), fileId, title)
return c.RenderJSON(re)
}
func (c File) DeleteImage(fileId string) revel.Result {
re := info.NewRe()
re.Ok, re.Msg = fileService.DeleteImage(c.GetUserId(), fileId)
return c.RenderJSON(re)
}
2014-09-19 17:18:53 +08:00
//-----------
// 输出image
// 权限判断
func (c File) OutputImage(noteId, fileId string) revel.Result {
2015-11-13 17:58:41 +08:00
path := fileService.GetFile(c.GetUserId(), fileId) // 得到路径
2014-09-19 17:18:53 +08:00
if path == "" {
return c.RenderText("")
}
2015-11-13 17:58:41 +08:00
fn := revel.BasePath + "/" + strings.TrimLeft(path, "/")
file, _ := os.Open(fn)
return c.RenderFile(file, revel.Inline) // revel.Attachment
2014-09-19 17:18:53 +08:00
}
// 协作时复制图片到owner
// 需要计算对方大小
2014-09-19 17:18:53 +08:00
func (c File) CopyImage(userId, fileId, toUserId string) revel.Result {
re := info.NewRe()
re.Ok, re.Id = fileService.CopyImage(userId, fileId, toUserId)
return c.RenderJSON(re)
2014-09-19 17:18:53 +08:00
}
2014-09-21 22:52:37 +08:00
2015-10-10 16:18:26 +08:00
// 复制外网的图片
// 都要好好的计算大小
2014-10-22 16:20:45 +08:00
func (c File) CopyHttpImage(src string) revel.Result {
re := info.NewRe()
2015-10-10 16:18:26 +08:00
// 生成上传路径
newGuid := NewGuid()
userId := c.GetUserId()
// fileUrlPath := "files/" + Digest3(userId) + "/" + userId + "/" + Digest2(newGuid) + "/images"
fileUrlPath := "files/" + GetRandomFilePath(userId, newGuid) + "/images"
2015-10-10 16:18:26 +08:00
dir := revel.BasePath + "/" + fileUrlPath
2014-10-22 16:20:45 +08:00
err := os.MkdirAll(dir, 0755)
if err != nil {
return c.RenderJSON(re)
2014-10-22 16:20:45 +08:00
}
filesize, filename, _, ok := netutil.WriteUrl(src, dir)
2015-10-10 16:18:26 +08:00
2014-10-22 16:20:45 +08:00
if !ok {
re.Msg = "copy error"
return c.RenderJSON(re)
2014-10-22 16:20:45 +08:00
}
2015-10-10 16:18:26 +08:00
2014-10-22 16:20:45 +08:00
// File
fileInfo := info.File{Name: filename,
Title: filename,
2015-10-10 16:18:26 +08:00
Path: fileUrlPath + "/" + filename,
Size: filesize}
id := bson.NewObjectId()
2014-10-22 16:20:45 +08:00
fileInfo.FileId = id
2015-10-10 16:18:26 +08:00
2014-10-22 16:20:45 +08:00
re.Id = id.Hex()
2015-11-13 17:58:41 +08:00
// re.Item = fileInfo.Path
re.Ok, re.Msg = fileService.AddImage(fileInfo, "", c.GetUserId(), true)
2015-10-10 16:18:26 +08:00
return c.RenderJSON(re)
}