diff --git a/app/src/config/exportConfig.ts b/app/src/config/exportConfig.ts index 03d517a41..db0ccffec 100644 --- a/app/src/config/exportConfig.ts +++ b/app/src/config/exportConfig.ts @@ -1,8 +1,9 @@ import {fetchPost} from "../util/fetch"; /// #if !BROWSER import {dialog} from "@electron/remote"; -import {SaveDialogReturnValue, shell} from "electron"; +import {shell} from "electron"; import {afterExport} from "../protyle/export/util"; +import * as path from "path"; /// #endif import {isBrowser} from "../util/functions"; import {showMessage} from "../dialog/message"; @@ -157,19 +158,20 @@ export const exportConfig = { window.location.href = response.data.zip; }); /// #else - dialog.showSaveDialog({ - defaultPath: "data", - properties: ["showOverwriteConfirmation"], - }).then((result: SaveDialogReturnValue) => { - if (!result.canceled) { - const msgId = showMessage(window.siyuan.languages.exporting, -1); - fetchPost("/api/export/exportDataInFolder", { - folder: result.filePath - }, () => { - afterExport(result.filePath, msgId); - }); - } - }); + let filePaths = dialog.showOpenDialogSync({ + title: window.siyuan.languages.export + " " + "Data", + properties: ["createDirectory", "openDirectory"], + }) + if (filePaths && 0 < filePaths.length) { + const savePath = filePaths[0]; + const msgId = showMessage(window.siyuan.languages.exporting, -1); + fetchPost("/api/export/exportDataInFolder", { + folder: savePath, + }, response => { + afterExport(path.join(savePath, response.data.name), msgId); + }); + } + /// #endif }); /// #if !BROWSER diff --git a/kernel/api/export.go b/kernel/api/export.go index 7e516d43e..aa7ed6f6a 100644 --- a/kernel/api/export.go +++ b/kernel/api/export.go @@ -41,13 +41,16 @@ func exportDataInFolder(c *gin.Context) { } exportFolder := arg["folder"].(string) - err := model.ExportDataInFolder(exportFolder) + name, err := model.ExportDataInFolder(exportFolder) if nil != err { ret.Code = -1 ret.Msg = err.Error() ret.Data = map[string]interface{}{"closeTimeout": 7000} return } + ret.Data = map[string]interface{}{ + "name": name, + } } func exportData(c *gin.Context) { diff --git a/kernel/model/export.go b/kernel/model/export.go index 108b3ac1e..fbe6a2c02 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -120,17 +120,18 @@ func ExportSY(id string) (name, zipPath string) { return } -func ExportDataInFolder(exportFolder string) (err error) { +func ExportDataInFolder(exportFolder string) (name string, err error) { util.PushEndlessProgress(Conf.Language(65)) defer util.ClearPushProgress(100) WaitForWritingFiles() exportFolder = filepath.Join(exportFolder, util.CurrentTimeSecondsStr()) - err = exportData(exportFolder) + zipPath, err := exportData(exportFolder) if nil != err { return } + name = filepath.Base(zipPath) return } @@ -140,10 +141,8 @@ func ExportData() (zipPath string) { WaitForWritingFiles() - baseFolderName := "data-" + util.CurrentTimeSecondsStr() - exportFolder := filepath.Join(util.TempDir, "export", baseFolderName) - zipPath = exportFolder + ".zip" - err := exportData(exportFolder) + exportFolder := filepath.Join(util.TempDir, "export", util.CurrentTimeSecondsStr()) + zipPath, err := exportData(exportFolder) if nil != err { return } @@ -151,7 +150,7 @@ func ExportData() (zipPath string) { return } -func exportData(exportFolder string) (err error) { +func exportData(exportFolder string) (zipPath string, err error) { baseFolderName := "data-" + util.CurrentTimeSecondsStr() if err = os.MkdirAll(exportFolder, 0755); nil != err { logging.LogErrorf("create export temp folder failed: %s", err) @@ -165,7 +164,7 @@ func exportData(exportFolder string) (err error) { return } - zipPath := exportFolder + ".zip" + zipPath = exportFolder + ".zip" zip, err := gulu.Zip.Create(zipPath) if nil != err { logging.LogErrorf("create export data zip [%s] failed: %s", exportFolder, err)