Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

功能优化和新增 #956

Merged
merged 11 commits into from
Jul 5, 2024
2 changes: 1 addition & 1 deletion conf/app.conf.example
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ avatar=/static/images/headimgurl.jpg
token_size=12

#上传文件的后缀,如果不限制后缀可以设置为 *
upload_file_ext=txt|doc|docx|xls|xlsx|ppt|pptx|pdf|7z|rar|jpg|jpeg|png|gif
upload_file_ext=txt|doc|docx|xls|xlsx|ppt|pptx|pdf|7z|rar|jpg|jpeg|png|gif|mp4|webm|avi

#上传的文件大小限制
# - 如果不填写, 则默认1GB,如果希望超过1GB,必须带单位
Expand Down
6 changes: 3 additions & 3 deletions conf/enumerate.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ func GetDefaultCover() string {
return URLForWithCdnImage(web.AppConfig.DefaultString("cover", "/static/images/book.jpg"))
}

// 获取允许的商城文件的类型.
// 获取允许的上传文件的类型.
func GetUploadFileExt() []string {
ext := web.AppConfig.DefaultString("upload_file_ext", "png|jpg|jpeg|gif|txt|doc|docx|pdf")
ext := web.AppConfig.DefaultString("upload_file_ext", "png|jpg|jpeg|gif|txt|doc|docx|pdf|mp4")

temp := strings.Split(ext, "|")

Expand Down Expand Up @@ -201,7 +201,7 @@ func GetExportOutputPath() string {
return exportOutputPath
}

// 判断是否是允许商城的文件类型.
// 判断是否是允许上传的文件类型.
func IsAllowUploadFileExt(ext string) bool {

if strings.HasPrefix(ext, ".") {
Expand Down
111 changes: 38 additions & 73 deletions controllers/DocumentController.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"html/template"
"image/png"
"io"
"mime/multipart"
"net/http"
"net/url"
"os"
Expand Down Expand Up @@ -486,66 +487,30 @@ func (c *DocumentController) Upload() {
c.JsonResult(6001, i18n.Tr(c.Lang, "message.param_error"))
}

name := "editormd-file-file"

// file, moreFile, err := c.GetFile(name)
// if err == http.ErrMissingFile || moreFile == nil {
// name = "editormd-image-file"
// file, moreFile, err = c.GetFile(name)
// if err == http.ErrMissingFile || moreFile == nil {
// c.JsonResult(6003, i18n.Tr(c.Lang, "message.upload_file_empty"))
// return
// }
// }
// ****3xxx
files, err := c.GetFiles(name)
if err == http.ErrMissingFile {
name = "editormd-image-file"
files, err = c.GetFiles(name)
if err == http.ErrMissingFile {
// c.JsonResult(6003, i18n.Tr(c.Lang, "message.upload_file_empty"))
// return
name = "file"
files, err = c.GetFiles(name)
// logs.Info(files)
if err == http.ErrMissingFile {
c.JsonResult(6003, i18n.Tr(c.Lang, "message.upload_file_empty"))
return
}
names := []string{"editormd-file-file", "editormd-image-file", "file", "editormd-resource-file"}
var files []*multipart.FileHeader
for _, name := range names {
file, err := c.GetFiles(name)
if err != nil {
continue
}
if len(file) > 0 && err == nil {
files = append(files, file...)
}
}

// if err != nil {
// http.Error(w, err.Error(), http.StatusNoContent)
// return
// }
// jMap := make(map[string]interface{})
// s := []map[int]interface{}{}
if len(files) == 0 {
c.JsonResult(6003, i18n.Tr(c.Lang, "message.upload_file_empty"))
return
}

result2 := []map[string]interface{}{}
var result map[string]interface{}
for i, _ := range files {
//for each fileheader, get a handle to the actual file
file, err := files[i].Open()

defer file.Close()
// if err != nil {
// http.Error(w, err.Error(), http.StatusInternalServerError)
// return
// }
// //create destination file making sure the path is writeable.
// dst, err := os.Create("upload/" + files[i].Filename)
// defer dst.Close()
// if err != nil {
// http.Error(w, err.Error(), http.StatusInternalServerError)
// return
// }
// //copy the uploaded file to the destination file
// if _, err := io.Copy(dst, file); err != nil {
// http.Error(w, err.Error(), http.StatusInternalServerError)
// return
// }
// }
// ****

if err != nil {
c.JsonResult(6002, err.Error())
Expand Down Expand Up @@ -619,19 +584,25 @@ func (c *DocumentController) Upload() {
filePath := filepath.Join(conf.WorkingDirectory, "uploads", identify)

//将图片和文件分开存放
// if filetil.IsImageExt(moreFile.Filename) {
attachment := models.NewAttachment()
var strategy filetil.FileTypeStrategy
if filetil.IsImageExt(files[i].Filename) {
filePath = filepath.Join(filePath, "images", fileName+ext)
strategy = filetil.ImageStrategy{}
attachment.ResourceType = "image"
} else if filetil.IsVideoExt(files[i].Filename) {
strategy = filetil.VideoStrategy{}
attachment.ResourceType = "video"
} else {
filePath = filepath.Join(filePath, "files", fileName+ext)
strategy = filetil.DefaultStrategy{}
attachment.ResourceType = "file"
}

filePath = strategy.GetFilePath(filePath, fileName, ext)

path := filepath.Dir(filePath)

_ = os.MkdirAll(path, os.ModePerm)

// err = c.SaveToFile(name, filePath) // frome beego controller.go: savetofile it only operates the first one of mutil-upload form file field.

//copy the uploaded file to the destination file
dst, err := os.Create(filePath)
defer dst.Close()
Expand All @@ -640,12 +611,6 @@ func (c *DocumentController) Upload() {
c.JsonResult(6005, i18n.Tr(c.Lang, "message.failed"))
}

// if err != nil {
// logs.Error("保存文件失败 -> ", err)
// c.JsonResult(6005, i18n.Tr(c.Lang, "message.failed"))
// }

attachment := models.NewAttachment()
attachment.BookId = bookId
// attachment.FileName = moreFile.Filename
attachment.FileName = files[i].Filename
Expand All @@ -662,8 +627,7 @@ func (c *DocumentController) Upload() {
attachment.DocumentId = docId
}

// if filetil.IsImageExt(moreFile.Filename) {
if filetil.IsImageExt(files[i].Filename) {
if filetil.IsImageExt(files[i].Filename) || filetil.IsVideoExt(files[i].Filename) {
attachment.HttpPath = "/" + strings.Replace(strings.TrimPrefix(filePath, conf.WorkingDirectory), "\\", "/", -1)
if strings.HasPrefix(attachment.HttpPath, "//") {
attachment.HttpPath = conf.URLForWithCdnImage(string(attachment.HttpPath[1:]))
Expand All @@ -689,19 +653,20 @@ func (c *DocumentController) Upload() {
}
}
result = map[string]interface{}{
"errcode": 0,
"success": 1,
"message": "ok",
"url": attachment.HttpPath,
"link": attachment.HttpPath,
"alt": attachment.FileName,
"is_attach": isAttach,
"attach": attachment,
"errcode": 0,
"success": 1,
"message": "ok",
"url": attachment.HttpPath,
"link": attachment.HttpPath,
"alt": attachment.FileName,
"is_attach": isAttach,
"attach": attachment,
"resource_type": attachment.ResourceType,
}
result2 = append(result2, result)
}
if name == "file" {
// froala单图片上传
if len(files) == 1 {
// froala单文件上传
c.Ctx.Output.JSON(result, true, false)
} else {
c.Ctx.Output.JSON(result2, true, false)
Expand Down
1 change: 1 addition & 0 deletions models/AttachmentModel.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ type Attachment struct {
FileExt string `orm:"column(file_ext);size(50);description(文件后缀)" json:"file_ext"`
CreateTime time.Time `orm:"type(datetime);column(create_time);auto_now_add;description(创建时间)" json:"create_time"`
CreateAt int `orm:"column(create_at);type(int);description(创建人id)" json:"create_at"`
ResourceType string `orm:"-" json:"resource_type"`
}

// TableName 获取对应上传附件数据库表名.
Expand Down
28 changes: 21 additions & 7 deletions static/css/markdown.preview.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
width: 100%;
overflow: auto;
border-bottom: none;
line-height: 1.5
line-height: 1.5;
display: table;
}

.editormd-preview-container table td,.editormd-preview-container table th {
Expand Down Expand Up @@ -50,30 +51,43 @@
width: 100%;
}

.whole-article-wrap {
display: flex;
flex-direction: column;
}

.article-body .markdown-toc{
position: fixed;
right: 0;
right: 50px;
width: 260px;
font-size: 12px;
margin-top: -70px;
overflow: auto;
margin-right: 50px;
border: 1px solid #e8e8e8;
border-radius: 6px;
}
.markdown-toc ul{
list-style:none;
}

.markdown-toc-list {
padding:20px 0 !important;
margin-bottom: 0 !important;
}

.markdown-toc .markdown-toc-list>li{
padding: 3px 10px 3px 16px;
line-height: 18px;
border-left: 2px solid #e8e8e8;
/*border-left: 2px solid #e8e8e8;*/
color: #595959;
margin-left: -2px;
}
.markdown-toc .markdown-toc-list>li.active{
border-right: 2px solid #25b864;
}

.article-body .markdown-article{
margin-right: 250px;
width: calc(100% - 260px);
/*margin-right: 250px;*/
}
.article-body.content .markdown-toc{
position: relative;
Expand All @@ -86,7 +100,7 @@
.markdown-toc-list .directory-item {
padding: 3px 10px 3px 16px;
line-height: 18px;
border-left: 2px solid #e8e8e8;
/*border-left: 2px solid #e8e8e8;*/
color: #595959;
}
.markdown-toc-list .directory-item-link {
Expand Down
2 changes: 1 addition & 1 deletion static/editor.md/css/editormd.css
Original file line number Diff line number Diff line change
Expand Up @@ -3594,7 +3594,7 @@
background-color: #f8f8f8;
}

.markdown-body img {
.markdown-body img, .markdown-body video {
max-width: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
Expand Down
3 changes: 2 additions & 1 deletion static/editor.md/css/editormd.preview.css
Original file line number Diff line number Diff line change
Expand Up @@ -2878,7 +2878,8 @@
background-color: #f8f8f8;
}

.markdown-body img {

.markdown-body img, .markdown-body video {
max-width: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
Expand Down
79 changes: 79 additions & 0 deletions static/js/editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,85 @@ function uploadImage($id, $callback) {
});
}


function uploadResource($id, $callback) {
locales = {
'zh-CN': {
unsupportType: '不支持的图片/视频格式',
uploadFailed: '图片/视频上传失败'
},
'en': {
unsupportType: 'Unsupport image/video type',
uploadFailed: 'Upload image/video failed'
}
}
/** 粘贴上传的资源 **/
document.getElementById($id).addEventListener('paste', function (e) {
if (e.clipboardData && e.clipboardData.items) {
var clipboard = e.clipboardData;
for (var i = 0, len = clipboard.items.length; i < len; i++) {
if (clipboard.items[i].kind === 'file' || clipboard.items[i].type.indexOf('image') > -1) {

var resource = clipboard.items[i].getAsFile();

var fileName = String((new Date()).valueOf());
console.log(resource.type)
switch (resource.type) {
case "image/png" :
fileName += ".png";
break;
case "image/jpg" :
fileName += ".jpg";
break;
case "image/jpeg" :
fileName += ".jpeg";
break;
case "image/gif" :
fileName += ".gif";
break;
case "video/mp4":
fileName += ".mp4";
break;
case "video/webm":
fileName += ".webm";
break;
default :
layer.msg(locales[lang].unsupportType);
return;
}
var form = new FormData();

form.append('editormd-resource-file', resource, fileName);

var layerIndex = 0;

$.ajax({
url: window.imageUploadURL,
type: "POST",
dataType: "json",
data: form,
processData: false,
contentType: false,
beforeSend: function () {
layerIndex = $callback('before');
},
error: function () {
layer.close(layerIndex);
$callback('error');
layer.msg(locales[lang].uploadFailed);
},
success: function (data) {
layer.close(layerIndex);
$callback('success', data);
}
});
e.preventDefault();
}
}
}
});
}

/**
* 初始化代码高亮
*/
Expand Down
Loading
Loading