fix: 客户端无法保存网络文件的情况

This commit is contained in:
Pang 2023-08-07 08:52:18 +08:00
parent 9efdeb6b97
commit ac46e1ca22
3 changed files with 38 additions and 16 deletions

View File

@ -8,7 +8,7 @@ const {
} = require('electron')
const fs = require('fs')
const url = require('url')
const {pipeline} = require('stream')
const request = require("request");
const MAILTO_PREFIX = "mailto:";
@ -39,6 +39,18 @@ const electronMenu = {
}
},
isBlob(url) {
return url.startsWith("blob:");
},
isDataUrl(url) {
return url.startsWith("data:");
},
isBlobOrDataUrl(url) {
return electronMenu.isBlob(url) || electronMenu.isDataUrl(url);
},
async saveImageAs(url, params) {
const targetFileName = params.suggestedFilename || params.altText || "image.png";
const {filePath} = await dialog.showSaveDialog({
@ -48,13 +60,15 @@ const electronMenu = {
if (!filePath) return; // user cancelled dialog
try {
if (url.startsWith("data:")) {
if (electronMenu.isBlobOrDataUrl(url)) {
await electronMenu.writeNativeImage(filePath, nativeImage.createFromDataURL(url));
} else {
const resp = await fetch(url);
if (!resp.ok) throw new Error(`unexpected response ${resp.statusText}`);
if (!resp.body) throw new Error(`unexpected response has no body ${resp.statusText}`);
pipeline(resp.body, fs.createWriteStream(filePath));
const writeStream = fs.createWriteStream(filePath)
const readStream = request(url)
readStream.pipe(writeStream);
readStream.on('end', function (response) {
writeStream.end();
});
}
} catch (err) {
await dialog.showMessageBox({
@ -84,7 +98,7 @@ const electronMenu = {
const url = params.linkURL || params.srcURL;
const popupMenu = new Menu();
if (!url.startsWith("blob:")) {
if (!electronMenu.isBlobOrDataUrl(url)) {
popupMenu.append(
new MenuItem({
label: electronMenu.language.openInBrowser,
@ -94,7 +108,10 @@ const electronMenu = {
},
}),
);
if (params.hasImageContents) {
}
if (params.hasImageContents) {
if (!electronMenu.isBlob(url)) {
popupMenu.append(
new MenuItem({
label: electronMenu.language.saveImageAs,
@ -105,9 +122,6 @@ const electronMenu = {
}),
);
}
}
if (params.hasImageContents) {
popupMenu.append(
new MenuItem({
label: electronMenu.language.copyImage,
@ -119,7 +133,7 @@ const electronMenu = {
);
}
if (!url.startsWith("blob:")) {
if (!electronMenu.isBlobOrDataUrl(url)) {
if (url.startsWith(MAILTO_PREFIX)) {
popupMenu.append(
new MenuItem({

View File

@ -36,6 +36,7 @@
"electron-builder": "^23.6.0",
"electron-notarize": "^1.2.2",
"form-data": "^4.0.0",
"request": "^2.88.2",
"ora": "^4.1.1"
},
"dependencies": {

View File

@ -2454,10 +2454,17 @@ export default {
break;
case 'imagedown':
this.$store.dispatch('downUrl', {
url: value,
token: false
})
if (this.$Electron) {
this.$Electron.sendMessage('saveImageAt', {
params: { },
url: value,
})
} else {
this.$store.dispatch('downUrl', {
url: value,
token: false
})
}
break;
case 'filepos':