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

Tauri?打開(kāi)本地文件踩坑分析解決

 更新時(shí)間:2023年04月14日 14:29:17   作者:用戶7612655850794  
這篇文章主要為大家介紹了Tauri?打開(kāi)本地文件踩坑分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Tauri 打開(kāi)本地文件踩坑

最近我在嘗試使用Tauri,遇到一個(gè)問(wèn)題,其實(shí)從事后來(lái)看,如果熟悉Tauri的api的話,是件分分鐘就能解決的事情,但由于思維慣性,實(shí)際卻困擾了我一整天,寫文記錄一下我踩坑的過(guò)程。

需求

需求很簡(jiǎn)單,就是打開(kāi)本地圖片進(jìn)行展示,同時(shí)還要能拿到圖片在本地的絕對(duì)路徑。

  • 展示圖片
  • 拿到絕對(duì)路徑

<input type="file" >存在的問(wèn)題

最先想到辦法,當(dāng)然是使用input元素,這是前端讀取本地文件的常規(guī)方案,而且我曾經(jīng)使用electron實(shí)現(xiàn)過(guò)一樣的功能,大致就是:

<input type="file" id="file-selector" />
document.getElementById("file-selector").addEventListener('change', e => {
    const files = e.target.files
    files.forEach(file => {
        const url = URL.createObjectURL(file)
        const path = file.path
    })
})

但遺憾的是,Tauri的File對(duì)象并沒(méi)有實(shí)現(xiàn)path這個(gè)屬性。

出于安全考慮,瀏覽器并沒(méi)有提供File對(duì)象的絕對(duì)路徑,pathelectron自己提供的:electron/file-object.md at main · electron/electron (github.com)

隨后,盡管想了各種辦法,比如引入file-selector之類的,但最終的結(jié)論是:input拿不到文件的絕對(duì)路徑。

Dialog打開(kāi)文件

我在心里吐槽“Tauri果然是不如electron”之后,我決定去Github上搜一下issue,不出所料,不只我一個(gè)人遇到這個(gè)問(wèn)題:

Getting a real path of file type input · Issue #87

這里面給出了一個(gè)拿到文件絕對(duì)路徑的辦法,那就是使用Dialog

首先在tauri.conf.json添加配置:

"allowlist": {
    "dialog": {
        "all": false,
        "open": true
    }
}

然后

import { open } from "@tauri/api/dialog"
async handler(){
  let file = await open()
}

open方法會(huì)像input file一樣打開(kāi)一個(gè)文件選擇框,返回文件的絕對(duì)路徑。

如果想一次選擇多個(gè)文件,可以添加選項(xiàng):

let files = await open({ multiple: true })

實(shí)際嘗試發(fā)現(xiàn),這樣確實(shí)能拿到文件的絕對(duì)路徑,但也只有絕對(duì)路徑。

于是我就陷入了困境:通過(guò)input可以展示圖片,但拿不到絕對(duì)路徑,而dialog可以拿到絕對(duì)路徑,卻無(wú)法顯示圖片,因?yàn)榍岸藷o(wú)法直接通過(guò)一個(gè)本地的絕對(duì)路徑來(lái)展示圖片。

怎么辦呢?

fs讀取文件

于是,我開(kāi)始考慮使用Tauri提供的fs API,利用絕對(duì)路徑來(lái)讀取文件內(nèi)容,然后再轉(zhuǎn)換成Blob對(duì)象。

配置tauri.conf.json

"allowlist": {
    "dialog": {
        "all": false,
        "open": true
    },
    "fs": {
        "all": false,
        "readFile": true,
    }
}

讀取文件并轉(zhuǎn)換:

import { readBinaryFile } from '@tauri-apps/api/fs';
import { open } from "@tauri/api/dialog"
async handler(){
  // 打開(kāi)文件獲取絕對(duì)路徑
  let files = await open({ multiple: true })
  files.forEach(async filePath => {
      // 讀取二進(jìn)制文件
      const contents = await readBinaryFile(filePath)
      // 轉(zhuǎn)換為blob對(duì)象,然后轉(zhuǎn)換為url
      const blob = new Blob([contents])
      const url = URL.createObjectURL(blob)
  })
}

但是,正如我預(yù)期的那樣,這么做有嚴(yán)重的性能問(wèn)題。

經(jīng)簡(jiǎn)單測(cè)試,打開(kāi)100張圖片(每張400kb左右)需要好幾秒鐘才能完成,打開(kāi)500張圖片更是花了約20秒才處理完畢。

而如果使用input file,500張圖片只要一兩秒就能搞定。

所以,雖然功能上已經(jīng)沒(méi)有問(wèn)題,但性能問(wèn)題無(wú)法忽視,看來(lái)還需要找找別的辦法。

最終解決辦法

經(jīng)過(guò)一整天的摸索,我最終找到了Tauri提供這個(gè)函數(shù):convertFileSrc,可以將一個(gè)絕對(duì)路徑轉(zhuǎn)換為類似于URL.createObjectURL那樣的URL。

值得一提的是,這個(gè)函數(shù)和最常用的 invoke處于同一個(gè)模塊內(nèi),而且在Tauri的文檔中,convertFileSrc甚至位于invoke之前,但我卻一直沒(méi)有注意到它,一方面是因?yàn)?,之前從沒(méi)有想過(guò)要使用絕對(duì)路徑來(lái)轉(zhuǎn)換URL,因?yàn)榧兦岸耸亲霾坏竭@一點(diǎn)的;另一方面,由于思維慣性,前端打開(kāi)本地文件往往都是用的input file,遇到這個(gè)問(wèn)題我一直想的是如何從input事件著手,沒(méi)有去仔細(xì)看文檔……這就是所謂的燈下黑嗎

首先,配置tauri.conf.json

{
    "allowlist": {
        "dialog": {
            "all": true,
            "open": true
        },
        "protocol": {
            "all": false,
            "asset": true,
            "assetScope": [
                "$PICTURE"
            ]
        }
    },
    "security": {
        "csp": "default-src 'self'; img-src 'self'; asset: https://asset.localhost"
    }
}

然后

import { convertFileSrc } from '@tauri-apps/api/tauri'
import { open } from "@tauri/api/dialog"
async handler(){
  let files = await open({ multiple: true })
  files.forEach(filePath =&gt; {
      const url = convertFileSrc(filePath)
  })
}

速度和HTML原生的input file差不多,雖然拿不到文件大小之類的信息,但至少我最需要的兩個(gè)需求可以實(shí)現(xiàn)了,只要有了絕對(duì)路徑,文件大小之類的可以交給Rust。

以上就是Tauri 打開(kāi)本地文件踩坑分析解決的詳細(xì)內(nèi)容,更多關(guān)于Tauri 打開(kāi)本地文件踩坑的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入講解下Rust模塊使用方式

    深入講解下Rust模塊使用方式

    很多時(shí)候,我們寫的代碼需要按模塊組織,因?yàn)槲覀儫o(wú)法將大量的代碼都寫在一個(gè)文件上,那樣不容易維護(hù),下面這篇文章主要給大家介紹了關(guān)于Rust模塊使用方式的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Rust自定義安裝路徑的詳細(xì)圖文教程

    Rust自定義安裝路徑的詳細(xì)圖文教程

    工欲善其事必先利其器,無(wú)論是對(duì)小白還是大神來(lái)說(shuō),想要學(xué)習(xí) Rust 第一步那必須是 Rust 的環(huán)境配置,下面這篇文章主要給大家介紹了關(guān)于Rust自定義安裝路徑的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-03-03
  • Rust使用kind進(jìn)行異常處理(錯(cuò)誤的分類與傳遞)

    Rust使用kind進(jìn)行異常處理(錯(cuò)誤的分類與傳遞)

    Rust?有一套獨(dú)特的處理異常情況的機(jī)制,它并不像其它語(yǔ)言中的?try?機(jī)制那樣簡(jiǎn)單,這篇文章主要介紹了Rust指南錯(cuò)誤的分類與傳遞以及使用kind進(jìn)行異常處理,需要的朋友可以參考下
    2022-09-09
  • 詳解Rust調(diào)用tree-sitter支持自定義語(yǔ)言解析

    詳解Rust調(diào)用tree-sitter支持自定義語(yǔ)言解析

    使用Rust語(yǔ)言結(jié)合tree-sitter庫(kù)解析自定義語(yǔ)言需要定義語(yǔ)法、生成C解析器,并在Rust項(xiàng)目中集成,具體步驟包括創(chuàng)建grammar.js定義語(yǔ)法,使用tree-sitter-cli工具生成C解析器,以及在Rust項(xiàng)目中編寫代碼調(diào)用解析器,這一過(guò)程涉及到對(duì)tree-sitter的深入理解和Rust語(yǔ)言的應(yīng)用技巧
    2024-09-09
  • 關(guān)于Rust?使用?dotenv?來(lái)設(shè)置環(huán)境變量的問(wèn)題

    關(guān)于Rust?使用?dotenv?來(lái)設(shè)置環(huán)境變量的問(wèn)題

    在項(xiàng)目中,我們通常需要設(shè)置一些環(huán)境變量,用來(lái)保存一些憑證或其它數(shù)據(jù),這時(shí)我們可以使用dotenv這個(gè)crate,接下來(lái)通過(guò)本文給大家介紹Rust?使用dotenv來(lái)設(shè)置環(huán)境變量的問(wèn)題,感興趣的朋友一起看看吧
    2022-01-01
  • Rust 函數(shù)詳解

    Rust 函數(shù)詳解

    函數(shù)在 Rust 語(yǔ)言中是普遍存在的。Rust 支持多種編程范式,但更偏向于函數(shù)式,函數(shù)在 Rust 中是“一等公民”,函數(shù)可以作為數(shù)據(jù)在程序中進(jìn)行傳遞,對(duì)Rust 函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-11-11
  • Rust讀取配置文件的實(shí)現(xiàn)步驟

    Rust讀取配置文件的實(shí)現(xiàn)步驟

    任何項(xiàng)目都離不開(kāi)對(duì)于配置文件的讀取和解析,rust項(xiàng)目也一樣,本文主要介紹了Rust讀取配置文件的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Rust語(yǔ)言中級(jí)教程之指針

    Rust語(yǔ)言中級(jí)教程之指針

    Rust中共有三種類型的指針,分別為引用,解引用,智能指針,這篇文章主要介紹了Rust語(yǔ)言中級(jí)教程之指針,需要的朋友可以參考下
    2023-05-05
  • Rust中的derive屬性示例詳解

    Rust中的derive屬性示例詳解

    derive屬性的出現(xiàn)解決了手動(dòng)實(shí)現(xiàn)一些特性時(shí)需要編寫大量重復(fù)代碼的問(wèn)題,它可以讓編譯器自動(dòng)生成這些特性的基本實(shí)現(xiàn),從而減少了程序員需要編寫的代碼量,這篇文章主要介紹了Rust中的derive屬性詳解,需要的朋友可以參考下
    2023-04-04
  • Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

    Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

    Rust通過(guò)Drop特性實(shí)現(xiàn)了自動(dòng)清理機(jī)制,確保資源在對(duì)象超出作用域時(shí)自動(dòng)釋放,避免了手動(dòng)管理資源時(shí)可能出現(xiàn)的內(nèi)存泄漏或雙重釋放問(wèn)題,智能指針如Box、Rc和RefCell都依賴于Drop來(lái)管理資源,提供了靈活且安全的資源管理方案
    2025-02-02

最新評(píng)論

上杭县| 兴义市| 富平县| 千阳县| 新化县| 梁山县| 大新县| 吉木乃县| 璧山县| 堆龙德庆县| 贵阳市| 祁东县| 贵定县| 敖汉旗| 阿图什市| 安福县| 响水县| 高阳县| 达州市| 太仆寺旗| 五华县| 平和县| 太康县| 荣昌县| 易门县| 梓潼县| 安宁市| 华容县| 诸城市| 涟源市| 江永县| 平潭县| 固始县| 新闻| 黑山县| 区。| 视频| 南溪县| 根河市| 遂川县| 青铜峡市|