fix: 修复客户端无法打开工作报告

This commit is contained in:
kuaifan 2025-06-02 10:18:55 +08:00
parent 678868153a
commit 5a1f130bec
3 changed files with 9 additions and 91 deletions

View File

@ -58,17 +58,8 @@ const electronMenu = {
}, },
async saveImageAs(url, params) { async saveImageAs(url, params) {
let extension = ''; let extension = url.split('.').pop().split(/[#?]/)[0].toLowerCase();
if (utils.isLocalHost(url)) { if (!['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(extension)) {
extension = utils.localAssetRestoreRealPath(url).split('.').pop().toLowerCase();
} else {
const urlExtension = url.split('.').pop().split(/[#?]/)[0].toLowerCase();
if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(urlExtension)) {
extension = urlExtension;
}
}
if (!extension) {
extension = 'png'; extension = 'png';
} }
@ -89,8 +80,6 @@ const electronMenu = {
try { try {
if (electronMenu.isBlobOrDataUrl(url)) { if (electronMenu.isBlobOrDataUrl(url)) {
await electronMenu.writeNativeImage(filePath, nativeImage.createFromDataURL(url)); await electronMenu.writeNativeImage(filePath, nativeImage.createFromDataURL(url));
} else if (utils.isLocalHost(url)) {
await fs.promises.copyFile(utils.localAssetRestoreRealPath(url), filePath);
} else { } else {
const writeStream = fs.createWriteStream(filePath) const writeStream = fs.createWriteStream(filePath)
const readStream = request(url) const readStream = request(url)

61
electron/electron.js vendored
View File

@ -11,7 +11,6 @@ const {
shell, shell,
globalShortcut, globalShortcut,
nativeTheme, nativeTheme,
protocol,
Tray, Tray,
Menu, Menu,
BrowserView, BrowserView,
@ -89,50 +88,6 @@ if (!fs.existsSync(cacheDir)) {
fs.mkdirSync(cacheDir, { recursive: true }); fs.mkdirSync(cacheDir, { recursive: true });
} }
// 在最开始就注册协议为特权协议
protocol.registerSchemesAsPrivileged([
{
scheme: 'local-asset',
privileges: {
standard: true,
secure: true,
supportFetchAPI: true,
corsEnabled: true
}
}
])
/**
* 创建协议
*/
function createProtocol() {
protocol.handle('local-asset', async (request) => {
const url = utils.localAssetRestoreRealPath(request.url)
if (url.includes('..')) {
return new Response('Access Denied', { status: 403 })
}
try {
if (!fs.existsSync(url)) {
return new Response('Not Found', { status: 404 })
}
const data = await fs.promises.readFile(url)
const mimeType = utils.getMimeType(url)
return new Response(data, {
headers: {
'Content-Type': mimeType
}
})
} catch (error) {
console.error('Protocol handler error:', error)
return new Response('Internal Error', { status: 500 })
}
})
}
/** /**
* 启动web服务 * 启动web服务
*/ */
@ -140,11 +95,11 @@ async function startWebServer() {
if (serverUrl) { if (serverUrl) {
return Promise.resolve(); return Promise.resolve();
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// 创建Express应用 // 创建Express应用
const app = express(); const app = express();
// 使用express.static中间件提供静态文件服务 // 使用express.static中间件提供静态文件服务
// Express内置了全面的MIME类型支持无需手动配置 // Express内置了全面的MIME类型支持无需手动配置
app.use(express.static(serverPublicDir, { app.use(express.static(serverPublicDir, {
@ -164,18 +119,18 @@ async function startWebServer() {
} }
} }
})); }));
// 404处理中间件 // 404处理中间件
app.use((req, res) => { app.use((req, res) => {
res.status(404).send('File not found'); res.status(404).send('File not found');
}); });
// 错误处理中间件 // 错误处理中间件
app.use((err, req, res, next) => { app.use((err, req, res, next) => {
console.error('Server error:', err); console.error('Server error:', err);
res.status(500).send('Internal Server Error'); res.status(500).send('Internal Server Error');
}); });
// 启动服务器 // 启动服务器
const server = app.listen(serverPort, 'localhost', () => { const server = app.listen(serverPort, 'localhost', () => {
console.log(`Express static file server running at http://localhost:${serverPort}/`); console.log(`Express static file server running at http://localhost:${serverPort}/`);
@ -183,7 +138,7 @@ async function startWebServer() {
serverUrl = `http://localhost:${serverPort}/`; serverUrl = `http://localhost:${serverPort}/`;
resolve(server); resolve(server);
}); });
// 错误处理 // 错误处理
server.on('error', (err) => { server.on('error', (err) => {
console.error('Server error:', err); console.error('Server error:', err);
@ -373,7 +328,7 @@ function preCreateChildWindow() {
const originalUA = browser.webContents.session.getUserAgent() || browser.webContents.getUserAgent() const originalUA = browser.webContents.session.getUserAgent() || browser.webContents.getUserAgent()
browser.webContents.setUserAgent(originalUA + " SubTaskWindow/" + process.platform + "/" + os.arch() + "/1.0"); browser.webContents.setUserAgent(originalUA + " SubTaskWindow/" + process.platform + "/" + os.arch() + "/1.0");
utils.loadUrl(browser, serverUrl, 'preload') utils.loadUrl(browser, serverUrl, '/preload')
preloadWindow = browser; preloadWindow = browser;
} }
@ -1010,8 +965,6 @@ if (!getTheLock) {
} }
// SameSite // SameSite
utils.useCookie() utils.useCookie()
// 创建协议
createProtocol()
// 创建主窗口 // 创建主窗口
createMainWindow() createMainWindow()
// 预创建子窗口 // 预创建子窗口

24
electron/utils.js vendored
View File

@ -639,30 +639,6 @@ const utils = {
} }
}, },
/**
* 本地资源路径还原
* @param {string} url
* @returns {string}
*/
localAssetRestoreRealPath(url) {
if (!utils.isLocalHost(url)) {
return url
}
let p0 = url.replace(/^local-asset:\/\//, '')
const p1 = path.join(__dirname, '.', p0)
if (fs.existsSync(p1)) {
return p1
}
const p2 = path.join(__dirname, '..', p0)
if (fs.existsSync(p2)) {
return p2
}
return url
},
/** /**
* 加载URL或文件 * 加载URL或文件
* @param browser * @param browser