記錄--createObjectURL這個API真好用,我舉幾個場景你們就懂了

林恒發表於2024-06-18

🧑‍💻 寫在開頭

點贊 + 收藏 === 學會🤣🤣🤣

前言

隨著我用 URL.createObjectURL 這個 API 越來越多次,越發感覺真的是一個很好用的方法,列舉一下我在專案中用到它的場景吧~

圖片預覽

以前我們想要預覽圖片,只能是上傳圖片到後端後,獲取到url然後賦予給img標籤,才能得到回顯預覽,但是有了URL.createObjectURL就不需要這麼麻煩了,直接可以在前端就達到預覽的效果~

<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>

  

音影片流傳輸

舉個例子,我們透過MediaStream 去不斷推流,達到了影片顯示的效果,有了URL.createObjectURL我們並不需要真的有一個url賦予video標籤,去讓影片顯示出來,只需要使用URL.createObjectURL去構造一個臨時的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>

結合 Blob

URL.createObjectURL結合Blob也可以做很多方便開發的事情~

WebWorker

我們知道,想要用 WebWorker 的話,是要先建立一個檔案,然後在裡面寫程式碼,然後去與這個檔案執行的程式碼進行通訊,有了URL.createObjectURL就不需要新建檔案了,比如下面這個解決excel耗時過長的場景,可以看到,我們傳給WebWorker的不是一個真的檔案路徑,而是一個臨時的路徑~

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讀取檔案內容
  const reader = new FileReader();

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

  // 讀取檔案
  reader.readAsArrayBuffer(file);

  // 監聽Web Worker返回的訊息
  worker.onmessage = function (e) {
    console.log('解析完成', e.data);
    worker.terminate(); // 當任務完成後,終止Web Worker
  };
};

下載檔案

同樣也可以應用在下載檔案上,下載檔案其實就是有一個url賦予到a標籤上,然後點選a標籤就能下載了,我們也可以用URL.createObjectURL去生成一個臨時url

// 建立檔案 Blob
const blob = new Blob([/* 檔案資料 */], { type: 'application/pdf' });

// 建立下載連結
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);

本文轉載於:https://juejin.cn/post/7358289528551686180

如果對您有所幫助,歡迎您點個關注,我會定時更新技術文件,大家一起討論學習,一起進步。

記錄--createObjectURL這個API真好用,我舉幾個場景你們就懂了

相關文章