用Electron開發企業網盤之分片下載(一)--通信

来源:https://www.cnblogs.com/shawnyung/archive/2018/12/10/10060119.html
-Advertisement-
Play Games

效果展示 項目背景: 由於瀏覽器的限制,web批量下載體驗不好以及無法下載文件夾。採用Electron技術,通過js開發PC應用程式,著力解決批量下載、斷點續傳、文件夾下載等問題。配合網頁版網盤使用,單個小文件使用瀏覽器內置下載,單個大文件、多文件、文件夾調用PC應用程式,提升下載體驗。 技術棧 E ...


效果展示 

 項目背景:

由於瀏覽器的限制,web批量下載體驗不好以及無法下載文件夾。採用Electron技術,通過js開發PC應用程式,著力解決批量下載、斷點續傳、文件夾下載等問題。配合網頁版網盤使用,單個小文件使用瀏覽器內置下載,單個大文件、多文件、文件夾調用PC應用程式,提升下載體驗。

技術棧

Electron項目的目的,是為了要避免使用 vue 手動建立起 electron 應用程式。electron-vue 充分利用 vue-cli 作為腳手架工具,加上擁有 vue-loader 的 webpackelectron-packager 或是 electron-builder,以及一些最常用的插件,如vue-routervuex 等等。

技術點分析

1、web、PC應用程式通信

官方描述:

 app.setAsDefaultProtocolClient(protocol[, path, args])

  • protocol String - 協議的名稱, 不包含 ://。 如果您希望應用程式處理 electron:// 的鏈接, 請將 electron 作為該方法的參數.
  • path String (可選) Windows -預設為 process.execPath
  • args String[] (可選) Windows - 預設為空數組

返回 Boolean -是否成功調用。

此方法將當前可執行文件設置為協議(也稱為URI方案) 的預設處理程式。 它允許您將應用程式更深入地集成到操作系統中。 一旦註冊成功, 所有 your-protocol:// 格式的鏈接都會使用你的程式打開。 整個鏈接 (包括協議) 將作為參數傳遞給您的應用程式。

在 Windows 系統中,你可以提供可選參數 path,可執行文件的路徑和 args (在啟動時傳遞給可執行文件的參數數組)

註意: 在 macOS 上, 您只能註冊已添加到應用程式的 info. plist 中的協議, 在運行時不能對其進行修改。 但是,您可以在構建時使用簡單的文本編輯器或腳本更改文件。 有關詳細信息,請參閱 Apple's documentation

API 在內部使用 Windows 註冊表和 LSSetDefaultHandlerForURLScheme。

獲取參數:

主要分為兩個階段:一是初次啟動應用,而是應用已啟動打開鏈接時。

階段一:

webContents渲染以及控制web頁面,是BrowserWindow對象的一個屬性。

Event:'did-finish-load'

導航完成時觸發,即選項卡的旋轉器將停止旋轉,並指派 onload 事件後。

contents.on('did-finish-load', () => {
    getPath().then(dir => {
      setDir(dir)
      fileList("DOWN_FILE_LIST_FLAG__804e62a93de9fda85bb6ca68b20d3d6d")
      if(macOpenUrl != ''){//macOS
        fileList(macOpenUrl)
      }else{
        try {
          let str = process.argv.slice(1)[0].split('//')[1]
          let downloadFlag = str.slice(0, str.length - 1)
          fileList(downloadFlag)  
        } catch (e) { console.log(e) }
      }

      let httpList = deepList('.cfg')
      contents.send('download', httpList)
    })
  })

階段二:

應用已啟動時,用戶打開URL。macOS有直接可捕捉的事件,Windows需要通過單實例的方法捕捉參數。

事件: 'open-url' macOS

返回:

  • event Event
  • url String

當用戶想要在應用中打開一個 URL 時發出。 應用程式的 Info. plist 文件必須在 CFBundleURLTypes 項中定義 url 方案, 並將 NSPrincipalClass 設置為 AtomApplication 

如果你想處理這個事件,你應該調用 event.preventDefault() 。

app.on("open-url", function(event, url) {
  //macOS:先進入open-url,再進入did-finish-load
  let downloadFlag = url.split('//')[1]
  macOpenUrl = downloadFlag
  if (mainWindow) {
    if (mainWindow.isMinimized()) mainWindow.restore()
    mainWindow.focus()
    try {
        fileList(downloadFlag)
    } catch (e) { console.log(e) }
  }
})

app.makeSingleInstance()

返回 Boolean

此方法使應用程式成為單個實例應用程式, 而不是允許應用程式的多個實例運行, 這將確保只有一個應用程式的實例正在運行, 其餘的實例全部會被終止並退出。

const shouldQuit = app.makeSingleInstance((commandLine, workingDirectory) => {
  // Someone tried to run a second instance, we should focus our window.
  if (mainWindow) {
    if (mainWindow.isMinimized()) mainWindow.restore()
    mainWindow.focus()
    try {   
      //dialog.showErrorBox('makeSingleInstance', commandLine.toString())
      let str = commandLine.slice(1)[0].split('//')[1]
      let downloadFlag = str.slice(0, str.length - 1)
      fileList(downloadFlag)
    } catch (e) { console.log(e) }
  }
})

URL長度限制問題:

 基於項目背景,web、PC應用程式需要傳遞文件列表。一開始的想法是整個文件列表通過URL傳遞,後來調試的時候發現:受限於URL的長度限制,可以傳遞的文件項十分有限。於是另尋他路,通過後臺中轉:web選中文件後,調用後臺介面,生成下載標識位,傳遞給PC應用程式。PC應用程式那邊獲取到下載標識位後,通過下載標識位再請求後臺介面獲取下載列表。

2、文件重命名演算法

 文件名的完整含義是文件的完整路徑,如:D:/tmp/新建文件夾/002.docx。文件重命名有兩個場景:一是當前的文件列表內,如果存在同名的文件,需要對當前的文件重命名,演算法同windows文件重命名演算法。二是文件保存到本地路徑時,如果當前路徑存在同名的文件,需要對當前的文件重命名,演算法同windows文件重命名演算法。

方法:fireRename(arr, basename, key)

  • arr Arrary - 文件列表
  • basename String 當前文件的文件名
  • key String(可選) 文件列表內每個對象文件名的關鍵字

文件重命名,返回重命名後的文件名。

const fileRename = (arr, basename, key) => {
  let existed
  arr.forEach((e, i) => {
    if (e[key] == basename) {
      existed = true
    }
  })
  if (!existed) {
    return basename
  }
  let extname = path.extname(basename)
  let re = new RegExp('(\\(\\d\\))*' + extname + '$')
  const compare = (c, b) => {
    return c.replace(re, '') == b.replace(re, '')
  }
  let arr_existed = []
  arr.forEach((e, i) => {
    let c = e[key]

    if (compare(c, basename)) {
      arr_existed.push(e[key].replace(c.replace(re, ''), ''))
    }
  })
  
  for (let i = 1; i < arr_existed.length + 2; i += 1) {
    if (arr_existed.indexOf('(' + i + ')' + extname) == -1) {
      return basename.replace(re, '(' + i + ')' + extname)
    }
  }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ————定義兩個數組,一個裝姓名,一個裝事件,順便定義一個定時器名 //document.getElementById("sb").innerHTML 獲取到的ID名為sb的元素裡面的內容//Math.floor(Math.random()*sname.length) 隨機生成一個0到sname.l ...
  • JS前導: ECMA歐洲電腦製造者協會 ECMA-262 (ES5規範) ECMA-404(Json規範) wsc定義HTML、CSS、DOM規範 電腦程式分為: cpu密集(用於計算) I/O密集(用於存儲) 真正參與計算的數據放在存儲單位中 其他暫時不用參與計算的數據放在記憶體中 cpu內部的 ...
  • 參考代碼將上傳至我的 倉庫,歡迎互粉: "https://github.com/dashnowords/blogs/tree/master" [TOC] 一. 再談從Virtual Dom生成真實DOM 在上一篇博文 "《javascript基礎修煉(10)——VirtualDOM和基本DFS》" ...
  • 來自:https://segmentfault.com/q/1010000011923504 侵刪 將其中的CourseName更改為title 修改成功! ...
  • 在開發中,通常會保持兩個分支master分支和develop分支,但是如果因為develop上面迭代太多而沒有及時維護master,最後想丟棄master而直接將測試確認過的develop強推到master,該怎麼操作呢? 網上搜了一下,但是真正自己使用起來卻又暴露出各種問題。因此,做如下總結分享, ...
  • ` ` ...
  • js 介面: 調用: 具體詳見官方api,很詳細 http://element.eleme.io/#/zh-CN/component/upload#attribute ...
  • Blob, Uint8Aray, atob/btoa in lt IE9 browser ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...