diff --git a/packages/web/src/query/RunnerOutputFiles.svelte b/packages/web/src/query/RunnerOutputFiles.svelte index aae7301dd..a7d43ded4 100644 --- a/packages/web/src/query/RunnerOutputFiles.svelte +++ b/packages/web/src/query/RunnerOutputFiles.svelte @@ -5,7 +5,7 @@ import formatFileSize from '../utility/formatFileSize'; import getElectron from '../utility/getElectron'; - import resolveApi from '../utility/resolveApi'; + import { downloadFromApi } from '../utility/exportFileTools'; import useEffect from '../utility/useEffect'; export let runnerId; @@ -66,9 +66,10 @@ { + downloadFromApi(`runners/data/${runnerId}/${row.name}`, row.name); + }} > download diff --git a/packages/web/src/utility/exportFileTools.ts b/packages/web/src/utility/exportFileTools.ts index 4916baddd..39ce5d676 100644 --- a/packages/web/src/utility/exportFileTools.ts +++ b/packages/web/src/utility/exportFileTools.ts @@ -1,7 +1,7 @@ import { ScriptWriter, ScriptWriterJson } from 'dbgate-tools'; import getElectron from './getElectron'; import { showSnackbar, showSnackbarInfo, showSnackbarError, closeSnackbar } from '../utility/snackbar'; -import resolveApi from './resolveApi'; +import resolveApi, { resolveApiHeaders } from './resolveApi'; import { apiCall, apiOff, apiOn } from './api'; import { normalizeExportColumnMap } from '../impexp/createImpExpScript'; import { getCurrentConfig } from '../stores'; @@ -42,8 +42,8 @@ export async function exportSqlDump(outputFile, connection, databaseName, pureFi onOpenResult: pureFileName && !getElectron() ? () => { - window.open(`${resolveApi()}/uploads/get?file=${pureFileName}`, '_blank'); - } + downloadFromApi(`uploads/get?file=${pureFileName}`, 'file.sql'); + } : null, openResultLabel: 'Download SQL file', }); @@ -112,7 +112,7 @@ export async function saveExportedFile(filters, defaultPath, extension, dataName finishedMessage: `Export ${dataName} finished`, afterFinish: () => { if (!electron) { - window.open(`${resolveApi()}/uploads/get?file=${pureFileName}`, '_blank'); + downloadFromApi(`uploads/get?file=${pureFileName}`, defaultPath); } }, }); @@ -207,7 +207,7 @@ export async function saveFileToDisk( } else { const resp = await apiCall('files/generate-uploads-file'); await filePathFunc(resp.filePath); - window.open(`${resolveApi()}/uploads/get?file=${resp.fileName}`, '_blank'); + await downloadFromApi(`uploads/get?file=${resp.fileName}`, `file.${formatExtension}`); } } @@ -220,3 +220,23 @@ export function openWebLink(href) { window.open(href, '_blank'); } } + +export async function downloadFromApi(route: string, donloadName: string) { + fetch(`${resolveApi()}/${route}`, { + method: 'GET', + headers: resolveApiHeaders(), + }) + .then((res) => res.blob()) + .then((blob) => { + const objUrl = URL.createObjectURL(blob); + const a = document.createElement("a"); + document.body.appendChild(a); + a.download = donloadName; + a.href = objUrl; + a.click(); + a.remove(); + setTimeout(() => { + URL.revokeObjectURL(objUrl) + }) + }) +}