فهرست منبع

:bug: API getFile/putFile does not perform read-write lock Fix https://github.com/siyuan-note/siyuan/issues/7832

Liang Ding 2 سال پیش
والد
کامیت
8545454f74
3فایلهای تغییر یافته به همراه21 افزوده شده و 10 حذف شده
  1. 18 3
      kernel/api/file.go
  2. 0 7
      kernel/model/file.go
  3. 3 0
      kernel/util/working.go

+ 18 - 3
kernel/api/file.go

@@ -18,6 +18,7 @@ package api
 
 import (
 	"io"
+	"mime"
 	"mime/multipart"
 	"net/http"
 	"os"
@@ -26,6 +27,7 @@ import (
 	"time"
 
 	"github.com/88250/gulu"
+	"github.com/gabriel-vasile/mimetype"
 	"github.com/gin-gonic/gin"
 	"github.com/siyuan-note/filelock"
 	"github.com/siyuan-note/logging"
@@ -104,10 +106,23 @@ func getFile(c *gin.Context) {
 		return
 	}
 
-	if err = model.ServeFile(c, filePath); nil != err {
-		c.Status(http.StatusConflict)
+	data, err := filelock.ReadFile(filePath)
+	if nil != err {
+		logging.LogErrorf("read file [%s] failed: %s", filePath, err)
+		c.Status(500)
 		return
 	}
+
+	contentType := mime.TypeByExtension(filepath.Ext(filePath))
+	if "" == contentType {
+		if m := mimetype.Detect(data); nil != m {
+			contentType = m.String()
+		}
+	}
+	if "" == contentType {
+		contentType = "application/octet-stream"
+	}
+	c.Data(http.StatusOK, contentType, data)
 }
 
 func readDir(c *gin.Context) {
@@ -179,7 +194,7 @@ func removeFile(c *gin.Context) {
 		return
 	}
 
-	if err = os.RemoveAll(filePath); nil != err {
+	if err = filelock.Remove(filePath); nil != err {
 		c.Status(500)
 		return
 	}

+ 0 - 7
kernel/model/file.go

@@ -36,7 +36,6 @@ import (
 	util2 "github.com/88250/lute/util"
 	"github.com/dustin/go-humanize"
 	"github.com/facette/natsort"
-	"github.com/gin-gonic/gin"
 	"github.com/siyuan-note/filelock"
 	"github.com/siyuan-note/logging"
 	"github.com/siyuan-note/siyuan/kernel/cache"
@@ -1641,9 +1640,3 @@ func (box *Box) removeSort(ids []string) {
 		return
 	}
 }
-
-func ServeFile(c *gin.Context, filePath string) (err error) {
-	WaitForWritingFiles()
-	c.File(filePath)
-	return
-}

+ 3 - 0
kernel/util/working.go

@@ -380,6 +380,9 @@ func initMime() {
 	mime.AddExtensionType(".dxf", "image/x-dxf")
 	mime.AddExtensionType(".dwf", "drawing/x-dwf")
 	mime.AddExtensionType(".pdf", "application/pdf")
+
+	// 文档数据文件
+	mime.AddExtensionType(".sy", "application/json")
 }
 
 func initPandoc() {