perf: 优化本地资源

This commit is contained in:
kuaifan 2024-11-18 10:40:32 +08:00
parent fc192891b7
commit 5b9b6ed966
6 changed files with 75 additions and 12 deletions

View File

@ -9,6 +9,7 @@ const {
const fs = require('fs')
const url = require('url')
const request = require("request");
const utils = require('./utils')
const MAILTO_PREFIX = "mailto:";
@ -52,9 +53,30 @@ const electronMenu = {
},
async saveImageAs(url, params) {
const targetFileName = params.suggestedFilename || params.altText || "image.png";
let extension = '';
if (utils.isProtocolResource(url)) {
extension = utils.protocolResourcePath(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';
}
let targetFileName = params.suggestedFilename || params.altText || "image";
if (!targetFileName.toLowerCase().endsWith('.' + extension)) {
targetFileName = targetFileName.replace(/\.[^/.]+$/, '') + '.' + extension;
}
const {filePath} = await dialog.showSaveDialog({
defaultPath: targetFileName,
filters: [
{ name: 'Images', extensions: ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'] }
]
});
if (!filePath) return; // user cancelled dialog
@ -62,6 +84,8 @@ const electronMenu = {
try {
if (electronMenu.isBlobOrDataUrl(url)) {
await electronMenu.writeNativeImage(filePath, nativeImage.createFromDataURL(url));
} else if (utils.isProtocolResource(url)) {
await fs.promises.copyFile(utils.protocolResourcePath(url), filePath);
} else {
const writeStream = fs.createWriteStream(filePath)
const readStream = request(url)
@ -98,7 +122,7 @@ const electronMenu = {
const url = params.linkURL || params.srcURL;
const popupMenu = new Menu();
if (!electronMenu.isBlobOrDataUrl(url)) {
if (!electronMenu.isBlobOrDataUrl(url) && !utils.isProtocolResource(url)) {
popupMenu.append(
new MenuItem({
label: electronMenu.language.openInBrowser,
@ -144,7 +168,7 @@ const electronMenu = {
},
}),
);
} else {
} else if (!utils.isProtocolResource(url)) {
popupMenu.append(
new MenuItem({
label: params.hasImageContents ? electronMenu.language.copyImageAddress : electronMenu.language.copyLinkAddress,

10
electron/electron.js vendored
View File

@ -76,21 +76,19 @@ protocol.registerSchemesAsPrivileged([
*/
function createProtocol() {
protocol.handle('dootask-resources', async (request) => {
const url = request.url.replace(/^dootask-resources:\/\//, '')
const url = utils.protocolResourcePath(request.url)
if (url.includes('..')) {
return new Response('Access Denied', { status: 403 })
}
try {
const filePath = path.join(__dirname, devloadUrl ? '..' : '.', url)
if (!fs.existsSync(filePath)) {
if (!fs.existsSync(url)) {
return new Response('Not Found', { status: 404 })
}
const data = await fs.promises.readFile(filePath)
const mimeType = utils.getMimeType(filePath)
const data = await fs.promises.readFile(url)
const mimeType = utils.getMimeType(url)
return new Response(data, {
headers: {

33
electron/utils.js vendored
View File

@ -606,6 +606,39 @@ const utils = {
});
});
},
/**
* 是否协议资源
* @param {string} url
* @returns {boolean}
*/
isProtocolResource(url) {
return url.startsWith('dootask-resources://')
},
/**
* 协议资源路径
* @param {string} url
* @returns {string}
*/
protocolResourcePath(url) {
if (!utils.isProtocolResource(url)) {
return url
}
let p0 = url.replace(/^dootask-resources:\/\//, '')
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
}
}
module.exports = utils;

View File

@ -62,4 +62,11 @@ const publicImageResources = (() => {
}
})()
export {publicImageResources}
const isPublicResources = (url) => {
return url && (
url.startsWith('file://') ||
url.startsWith('dootask-resources://')
)
}
export {publicImageResources, isPublicResources}

View File

@ -673,6 +673,7 @@ import DialogGroupVote from "./DialogGroupVote";
import DialogComplaint from "./DialogComplaint";
import touchclick from "../../../directives/touchclick";
import {languageList} from "../../../language";
import {isPublicResources} from "../../../components/Replace/utils";
export default {
name: "DialogWrapper",
@ -2879,7 +2880,7 @@ export default {
})
}
if (msgData.type === 'text') {
if (event.target.nodeName === 'IMG') {
if (event.target.nodeName === 'IMG' && !isPublicResources(event.target.currentSrc)) {
this.operateCopys.push({
type: 'imagedown',
icon: '',

@ -1 +1 @@
Subproject commit c5f85805ddd9f9cc36924b018a1fd779d70025fa
Subproject commit 9804c916c25dd6a413b489096675286548e36f40