最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Electron實現(xiàn)文件復(fù)制到剪切板的方案

 更新時間:2024年11月13日 08:23:23   作者:smallzip  
這篇文章主要介紹了Electron實現(xiàn)文件復(fù)制到剪切板的解決方案,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

前言

electron的剪切板沒有提供文件、音頻、視頻等等類型的支持。

技術(shù)調(diào)研

我們在mac、windows系統(tǒng)中,右鍵本地文件是支持復(fù)制的,并寫入到剪切板的速度很快。

基于這個方向,我們查找到了如下方法:

window:使用powershell腳本命令,可以實現(xiàn)文件復(fù)制

`powershell -command "& {Set-Clipboard -Path '${filePath}'}"`

mac:使用osascript腳本指令,可以實現(xiàn)文件復(fù)制

`osascript -e 'set the clipboard to POSIX file "${filePath}"'`

注意點

powershell和asascript在兩個平臺支持復(fù)制文件、音頻、視頻等等,前提條件都是需要文件已經(jīng)存在于本地。

所以,我們復(fù)制的內(nèi)容必須先現(xiàn)在到本地,再進(jìn)行復(fù)制到剪切板。

實現(xiàn)方案

渲染層提供preload

contextBridge.exposeInMainWorld("mainWindowAPI", {
  copyFile: (filePath:string) => ipcRenderer.invoke('copy-file', filePath)
});

復(fù)制的實際,需要傳遞已經(jīng)緩存到本地的文件路徑;

主進(jìn)程接收ipc

  // 復(fù)制文件到剪切板
  ipcMain.on("copy-file", (event: Electron.IpcMainEvent, filePath: string) => {
    // 檢查filePath是否存在,不存在則退出
    if(!filePath) {
      event.reply("copy-file", false);
      return;
    }
    
    // 處理base64
    if (filePath.startsWith('data:')) {
      try {
        const image = Buffer.isBuffer(filePath) ? nativeImage.createFromBuffer(filePath) : nativeImage.createFromDataURL(url);
        clipboard.writeImage(image)
        Logger.log(`【copy-file】復(fù)制base64成功`)
        event.reply("copy-file", true);
      } catch (error) {
        Logger.log(`【copy-file】復(fù)制base64失敗 ${error}`)
        event.reply("copy-file", false);
      }
      return
    }

    // 檢查是否為本地路徑,如果不是本地路徑則退出
    if(filePath.includes('file://')) {
      event.reply("copy-file", false);
      return;
    }

    // 執(zhí)行復(fù)制操作
    copyFile(filePath.replace("file:///", "")).then((res: boolean) => {
      event.reply("copy-file", res);
    }).catch(() => {
      event.reply("copy-file", false);
    })
  });

1.檢查filePath是否存在,不存在則退出

2.如果是base64圖片,則使用electron的nativeImage轉(zhuǎn)換成為PNG圖片(或者jpg等,可以看官網(wǎng)

3.檢查是否為本地路徑,如果不是本地路徑則退出,因為復(fù)制到剪切板必須是本地文件,網(wǎng)絡(luò)連接是不支持的

4.是本地連接,去除file:///頭,只需要后面的文件路徑,路徑如下:/Users/自己設(shè)備的賬戶名/Library/Application Support/應(yīng)用名稱/Cache/test.dmg

檢查不同平臺

/**
 * 復(fù)制文件到剪貼板
 *
 * @param localFileUrl 本地文件URL
 * @returns 復(fù)制結(jié)果,成功為true,失敗為false
 */
export function copyFile(localFileUrl: string) {
	if (process.platform === 'darwin') {
		return copyFileForMac(localFileUrl);
	} else if (process.platform === 'win32') {
		return copyFileForWindows(localFileUrl)
	}
}

mac系統(tǒng)復(fù)制到剪切板

/**
 * 將文件復(fù)制到Mac的剪貼板
 *
 * @param localFileUrl 本地文件的URL路徑
 * @returns 返回一個Promise,成功時返回true,失敗時返回錯誤消息
 */
function copyFileForMac(localFileUrl: string) {
  return new Promise((resolve, reject) => {
   // 文件的路徑
   const filePath = path.resolve(localFileUrl);
   Logger.log(`【copyFileForMac】Copying file to clipboard: ${filePath}`)
   // 使用AppleScript將文件復(fù)制到剪貼板
   const copyFileToClipboardScript = `osascript -e 'set the clipboard to POSIX file "${filePath}"'`;
   // 執(zhí)行AppleScript
   try {
    // 檢查文件是否存在本地
    if (!fs.existsSync(filePath)) {
     reject(false)
     Logger.error(`【copyFileForMac】Error: File not found at path ${filePath}`);
    }
    
    exec(copyFileToClipboardScript, (error: { message: any; }, stdout: any, stderr: any) => {
     if (error) {
      reject(false)
      Logger.error(`【copyFileForMac】Error: ${error.message}`);
      return;
     }
     
     if (stderr) {
      reject(false)
      Logger.error(`【copyFileForMac】Error: ${stderr}`);
      return;
     }
     
     resolve(true)
     Logger.log('【copyFileForMac】文件已經(jīng)被寫入剪切板');
    });
   } catch (error) {
    Logger.error(`【copyFileForMac】Error: ${error}`);
    reject(false)
   }
  });
}

windows系統(tǒng)復(fù)制到剪切板

/**
 * 將文件復(fù)制到Windows系統(tǒng)的剪貼板
 *
 * @param localFileUrl 文件路徑
 * @returns 返回一個Promise,如果成功復(fù)制到剪貼板,則resolve為true;如果失敗,則reject為錯誤信息
 */
function copyFileForWindows(localFileUrl: string) {
  return new Promise((resolve, reject) => {
   // 文件的路徑
   const filePath = path.resolve(localFileUrl);
   Logger.log(`【copyFileForWindows】Copying file to clipboard: ${filePath}`)
   // 使用powershell命令將文件復(fù)制到剪貼板
   const copyFileToClipboardScript = `${powershellBin} -command "& {Set-Clipboard -Path '${filePath}'}"`;
   // 執(zhí)行powershell命令
   try {
    // 檢查文件是否存在本地
    if (!fs.existsSync(filePath)) {
     reject(false)
     Logger.error(`【copyFileForMac】Error: File not found at path ${filePath}`);
    }
    
    exec(copyFileToClipboardScript, (error: { message: any; }, stdout: any, stderr: any) => {
     if (error) {
      reject(error)
      Logger.error(`【copyFileForWindows】Error: ${error.message}`);
      return;
     }
     
     if (stderr) {
      reject(stderr)
      Logger.error(`【copyFileForWindows】Error: ${stderr}`);
      return;
     }
     
     resolve(true)
     Logger.log('【copyFileForWindows】文件已經(jīng)被寫入剪切板');
    });
   } catch (error) {
    reject(error)
    Logger.error(`【copyFileForWindows】Error: ${error}`);
   }
  });
}

總結(jié)

electron的clipboard剪切板只支持text、html、rtf、bookmark、writeImage等,5種類型寫入到剪切板,并不支持其他文件類型、如file、video、audio等等

const { clipboard } = require('electron')

clipboard.write({
  text: 'test',
  html: '<b>Hi</b>',
  rtf: '{\rtf1\utf8 text}',
  bookmark: 'a title'
})

console.log(clipboard.readText())
// 'test'

console.log(clipboard.readHTML())
// <meta charset='utf-8'><b>Hi</b>

console.log(clipboard.readRTF())
// '{\rtf1\utf8 text}'

console.log(clipboard.readBookmark())
// { title: 'a title', url: 'test' }

我們參考系統(tǒng)級別的復(fù)制體性,最終實現(xiàn)了的文件復(fù)制到剪切板功能。

能夠?qū)崿F(xiàn)的前提是,文件已經(jīng)存儲在用戶本地設(shè)備。

補(bǔ)充

業(yè)務(wù)層面,如何將文件緩存到本地,則需要用到electron的WebRequest網(wǎng)絡(luò)攔截功能,再業(yè)務(wù)層資源下拉的時候攔截對應(yīng)的請求,并將資源緩存到我們指定的文件夾位置,后續(xù)復(fù)制的時候,則直接讀取緩存的文件路徑提供給 copy-file。

以上就是Electron實現(xiàn)文件復(fù)制到剪切板的方案的詳細(xì)內(nèi)容,更多關(guān)于Electron文件復(fù)制到剪切板的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js鏈接確認(rèn)提醒功能

    js鏈接確認(rèn)提醒功能

    非常不錯的功能,當(dāng)單機(jī)一個鏈接時,會彈出確認(rèn)對話框效果
    2008-09-09
  • [HTML/CSS/Javascript]WWTJS

    [HTML/CSS/Javascript]WWTJS

    [HTML/CSS/Javascript]WWTJS...
    2007-09-09
  • JavaScript讀取中文cookie時的亂碼問題的解決方法

    JavaScript讀取中文cookie時的亂碼問題的解決方法

    讀取中文cookie時出現(xiàn)亂碼,下面是具體的解決方法,大家以后使用過程中,盡量不要用中文。
    2009-10-10
  • 優(yōu)化innerHTML操作(提高代碼執(zhí)行效率)

    優(yōu)化innerHTML操作(提高代碼執(zhí)行效率)

    多數(shù)現(xiàn)代瀏覽器都實現(xiàn)了innerHTML操作,它的方便性讓我們愛不釋手,但如果使用不當(dāng),很容易出現(xiàn)效率問題,本文通過一個例子來說明如何優(yōu)化innerHTML操作。
    2011-08-08
  • JavaScript工具庫之Lodash詳解

    JavaScript工具庫之Lodash詳解

    這篇文章主要介紹了JavaScript工具庫之Lodash詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • 史上最為詳細(xì)的javascript繼承(推薦)

    史上最為詳細(xì)的javascript繼承(推薦)

    這篇文章主要介紹了javascript繼承,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • JS繪制微信小程序畫布時鐘

    JS繪制微信小程序畫布時鐘

    微信小程序官方組件也提供了畫布功能,下面分享一下如何創(chuàng)建微信小程序畫布時鐘
    2016-12-12
  • JavaScript中的常見繼承總結(jié)

    JavaScript中的常見繼承總結(jié)

    這篇文章主要介紹了JavaScript中的常見繼承總結(jié),繼承其實就是構(gòu)造函數(shù)和構(gòu)造函數(shù)之間的一種關(guān)系,更多相關(guān)介紹,需要的小伙伴可以參考下面文章內(nèi)容
    2022-09-09
  • Bootstrap彈出框(modal)垂直居中的問題及解決方案詳解

    Bootstrap彈出框(modal)垂直居中的問題及解決方案詳解

    這篇文章主要介紹了Bootstrap彈出框(modal)垂直居中的問題及解決方案詳解的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • JS實現(xiàn)隱藏同級元素后只顯示JS文件內(nèi)容的方法

    JS實現(xiàn)隱藏同級元素后只顯示JS文件內(nèi)容的方法

    這篇文章主要介紹了JS實現(xiàn)隱藏同級元素后只顯示JS文件內(nèi)容的方法,可實現(xiàn)將與js文件的同級元素全部隱藏,只顯示js文件內(nèi)容的功能,涉及javascript針對頁面元素的遍歷與屬性修改相關(guān)技巧,需要的朋友可以參考下
    2016-09-09

最新評論

青川县| 台州市| 建湖县| 桓台县| 二手房| 延吉市| 马尔康县| 兴隆县| 怀仁县| 台中市| 抚宁县| 平远县| 桦甸市| 景洪市| 庆云县| 吉木乃县| 淮阳县| 永清县| 屯留县| 长宁区| 嵩明县| 阿克苏市| 霍州市| 黄平县| 绩溪县| 阿拉善左旗| 宜宾市| 兖州市| 临沧市| 碌曲县| 新沂市| 旅游| 文安县| 湘潭市| 新蔡县| 临泽县| 宁乡县| 芜湖市| 蓬莱市| 乌鲁木齐县| 黎城县|