javascript中的URL

MDN中的介紹 URL 接口用于解析,構(gòu)造,規(guī)范化和編碼 URL。它通過提供允許你輕松閱讀和修改 URL 組件的屬性來工作。通常,通過在調(diào)用 URL 的構(gòu)造函數(shù)時(shí)將 URL 指定為字符串或提供相對(duì) URL 和基本 URL 來創(chuàng)建新的 URL 對(duì)象。然后,你可以輕松讀取 URL 的已解析組成部分或?qū)?URL 進(jìn)行更改。

靜態(tài)方法createObjectURL

URL.createObjectURL() 靜態(tài)方法會(huì)創(chuàng)建一個(gè) DOMString,其中包含一個(gè)表示參數(shù)中給出的對(duì)象的URL。這個(gè) URL 的生命周期和創(chuàng)建它的窗口中的 document 綁定。這個(gè)新的URL 對(duì)象表示指定的 File 對(duì)象或 Blob 對(duì)象。

簡單的理解一下就是將一個(gè)file或Blob類型的對(duì)象轉(zhuǎn)為UTF-16的字符串,并保存在當(dāng)前操作的document下。

URL.createObjectURL()與FileReader.readAsDataURL()

返回值
  • FileReader.readAsDataURL(file)可以得到一段base64的字符串。
  • URL.createObjectURL(file)可以得到當(dāng)前文件的一個(gè)內(nèi)存URL。
內(nèi)存使用
  • FileReader.readAsDataURL(file)的返回值是轉(zhuǎn)換后的超長base64字符串(長度與要解析的文件大小正相關(guān))。
  • URL.createObjectURL(file)的返回值雖然是字符串,但是是一個(gè)url地址
內(nèi)存清理
  • FileReader.readAsDataURL(file)依照js垃圾回收機(jī)制自動(dòng)從內(nèi)存中處理
  • URL.createObjectURL(file) 存在與當(dāng)前的document內(nèi),清除方式只有unload()事件或 revokeObjectURL()手動(dòng)清楚
執(zhí)行機(jī)制
  • FileRead.readAsDataURL(file)通過回調(diào)的形式返回.異步執(zhí)行
  • URL.createObjectURL(file) 直接返回,同步執(zhí)行
其它
  • FileReader.readAsDataURL(file)當(dāng)多個(gè)文件同時(shí)處理時(shí),需要每一個(gè)文件對(duì)應(yīng)一個(gè)新的FileReader對(duì)象。


    image.png
  • URL.createObjectURL(file)依次返回?zé)o影響。

URL.createObjectURL(file)得到本地內(nèi)存容器的URL地址,方便預(yù)覽,多次使用需要注意手動(dòng)釋放內(nèi)存的問題,性能優(yōu)秀。
FileReader.readAsDataURL(file)勝在直接轉(zhuǎn)為base64格式,可以直接用于業(yè)務(wù),無需二次轉(zhuǎn)換格式。

URL.createObjectURL 應(yīng)用場(chǎng)景

圖片預(yù)覽

以前我們想要預(yù)覽圖片,只能是上傳圖片到后端后,獲取到url然后賦予給img標(biāo)簽,才能得到回顯預(yù)覽,但是有了URL.createObjectURL就不需要這么麻煩了,直接可以在前端就達(dá)到預(yù)覽的效果~

<body>
  <input type="file" id="fileInput">
  <img id="preview" src="" alt="Preview">
  <script>
    const fileInput = document.getElementById('fileInput');
    fileInput.addEventListener('change', (event) => {
      const file = event.target.files[0];
      const fileUrl = URL.createObjectURL(file);
      const previewElement = document.getElementById('preview');
      previewElement.src = fileUrl;
    });
  </script>
</body>

音視頻流傳輸

舉個(gè)例子,我們通過MediaStream 去不斷推流,達(dá)到了視頻顯示的效果,有了URL.createObjectURL我們并不需要真的有一個(gè)url賦予video標(biāo)簽,去讓視頻顯示出來,只需要使用URL.createObjectURL去構(gòu)造一個(gè)臨時(shí)的url即可非常方便

<body>
  <video id="videoElement" autoplay playsinline></video>

  <script>
    const videoElement = document.getElementById('videoElement');

    navigator.mediaDevices.getUserMedia({ video: true, audio: true })
      .then((stream) => {
        videoElement.srcObject = stream;
      })
      .catch((error) => {
        console.error('Error accessing webcam:', error);
      });
  </script>

</body>

WebWorker

我們知道,想要用 WebWorker 的話,是要先創(chuàng)建一個(gè)文件,然后在里面寫代碼,然后去與這個(gè)文件運(yùn)行的代碼進(jìn)行通信,有了URL.createObjectURL就不需要新建文件了,比如下面這個(gè)解決excel耗時(shí)過長的場(chǎng)景,可以看到,我們傳給WebWorker的不是一個(gè)真的文件路徑,而是一個(gè)臨時(shí)的路徑~

const handleImport = (ev: Event) => {
  const file = (ev.target as HTMLInputElement).files![0];
  const worker = new Worker(
    URL.createObjectURL(
      new Blob([
        `
        importScripts('https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.16.4/xlsx.full.min.js');
        onmessage = function(e) {
          const fileData = e.data;
          const workbook = XLSX.read(fileData, { type: 'array' });
          const sheetName = workbook.SheetNames[0];
          const sheet = workbook.Sheets[sheetName];
          const data = XLSX.utils.sheet_to_json(sheet, { header: 1 });
          postMessage(data);
        };
        `,
      ]),
    ),
  );

  // 使用FileReader讀取文件內(nèi)容
  const reader = new FileReader();

  reader.onload = function (e: any) {
    const data = new Uint8Array(e.target.result);
    worker.postMessage(data);
  };

  // 讀取文件
  reader.readAsArrayBuffer(file);

  // 監(jiān)聽Web Worker返回的消息
  worker.onmessage = function (e) {
    console.log('解析完成', e.data);
    worker.terminate(); // 當(dāng)任務(wù)完成后,終止Web Worker
  };
};

下載文件

同樣也可以應(yīng)用在下載文件上,下載文件其實(shí)就是有一個(gè)url賦予到a標(biāo)簽上,然后點(diǎn)擊a標(biāo)簽就能下載了,我們也可以用URL.createObjectURL去生成一個(gè)臨時(shí)url

// 創(chuàng)建文件 Blob
const blob = new Blob([/* 文件數(shù)據(jù) */], { type: 'application/pdf' });

// 創(chuàng)建下載鏈接
const downloadUrl = URL.createObjectURL(blob);
const downloadLink = document.createElement('a');
downloadLink.href = downloadUrl;
downloadLink.download = 'document.pdf';
downloadLink.textContent = 'Download PDF';
document.body.appendChild(downloadLink);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容