当前位置: 首页 > article >正文

Electron:点击右键保存图片到本地

前期插件

前端请求后台的一种方法

npm install got -S

用于获取ArrayBuffer文件类型

npm install image-type -S

生成随机数

npm install randomstring -D

增加右击事件

点击右击事件的时候加载菜单

const imageRightSave = require("./ImageRightSave")  // 创建右击菜单
const imageSaveLocalUtil = require("../utils/ImageSaveLocalUtil");  // 保存图片到本地
let shortcutRegistered = false;  // 用于控制是否注册快捷键

// 监听右击事件
win.webContents.on('context-menu', (e, args) => {
  if (!args.srcURL) return  // 如果路由地址为空则不显示快捷键
  if (!shortcutRegistered) {
    globalShortcut.register("CommandOrControl+S", () => {
      imageSaveLocalUtil(args.srcURL)
    })
    shortcutRegistered = true
  }
  contextMenu = imageRightSave(args.srcURL)
  contextMenu.popup()

  contextMenu.on("menu-will-close", () => {
    globalShortcut.unregister("CommandOrControl+S")  // 注销快捷键
    shortcutRegistered = false
  })
})

编写菜单

注意:accelerator只负责显示快捷键,但是没有快捷键的功能,需要自己手动编写快捷键的规则。 切记 切记 切记!!!

const {Menu} = require('electron');
const imageSaveLocalUtil = require("../utils/ImageSaveLocalUtil")

const imageRightSave = (url) => {
  const template = [
    {
      label: "图片另存为...",
      accelerator: "CommandOrControl+S",  // 仅仅用于快捷键的显示,但是不会有快捷键的功能
      click: async () => {
        imageSaveLocalUtil(url)  // 保存图片到本地
      }
    }
  ]
  return Menu.buildFromTemplate(template)
}

module.exports = imageRightSave

保存本地

const {dialog} = require("electron");
const {default: got} = require("got");
const path = require("path");
const randomstring = require("randomstring");
const fs = require("fs");
const warningMessageUtil = require("./WarningMessageUtil");


/**
 * 加载文件类型
 * @param chunk
 */
async function loadFileType(chunk) {
  const imageType = (await import('image-type')).default;
  const imgType = await imageType(chunk)  // 现在您可以使用 imageType 了
  return imgType.ext;
}

/**
 * 将图片保存到本地
 */
const imageSaveLocalUtil = async (url) => {
  await got.get(url).then(async (res) => {
    const chunk = Buffer.from(res.rawBody);
    const suffix = await loadFileType(chunk)
    if (suffix == null || suffix == undefined || suffix == "") {
      warningMessageUtil("图片加载失败")
      return
    }
    const {filePath, canceled} = await dialog.showSaveDialog({
      title: '图片另存为',
      defaultPath: path.resolve(__dirname, '../../public/uploads/' + randomstring.generate(10) + "." + suffix),
    })
    if (canceled) return  // 用户点击了取消
    fs.writeFileSync(filePath, chunk)  // 数组写入本地
  }).catch((e) => {
    console.error(e)
  })
}

module.exports = imageSaveLocalUtil


警告消息提示

const {dialog, ipcMain} = require('electron');

const messagePrompt = (msg) => {
  dialog.showMessageBox({
    message: msg,
    type: 'warning',
  })
}

module.exports = messagePrompt

http://www.kler.cn/a/578022.html

相关文章:

  • MouseBoost Pro for Mac 鼠标右键助手右键菜单
  • oracle goldengate 各版本支持的源端和目标端的数据库版本列表
  • 从厨电模范到数字先锋,看永洪科技如何助力方太集团开启数字新征程
  • 大彩串口屏开发 —— MODBUS通信
  • 通过计费集成和警报监控 Elasticsearch Service 成本
  • MySQL进阶-关联查询优化
  • 若依ry-vue分离板(完整版)前后端部署
  • 爬虫案例八js逆向爬取网易音乐
  • C++ STL深度解析:现代编程的瑞士军刀
  • Golang的数据库备份与恢复
  • 提升博客流量的核心SEO策略以及AI工具推荐
  • MTK Android12 添加GMS后,报“设备未经过play保护认证“问题
  • 解决电脑问题(6)——键盘问题
  • Windows下安装kafka
  • Python----数据可视化(Seaborn一:介绍,应用)
  • Redis--Hash类型
  • 13、JavaEE核心技术 - Servlet与JSP
  • Python基于Django的医用耗材网上申领系统【附源码、文档说明】
  • git 添加额外的远程仓库 URL
  • DeepSeek开源大模型的市场策略:真实目的解析