JS圖片下載:從本地、生成、流、顯示到頁面、token可下載

一、JS圖片下載本地

通過調用瀏覽器的下載功能,可以將圖片下載到本地。

function downloadImage(url) {
  let filename = url.substring(url.lastIndexOf('/') + 1).split("?")[0];
  let a = document.createElement('a');
  a.href = url;
  a.download = filename;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}

在需要下載圖片的地方調用該函數即可:

downloadImage("http://example.com/images/example.jpg");

二、JS生成圖片下載到本地

如果需要將通過JS生成的圖片下載到本地,可以使用canvas將圖片轉換成base64編碼格式,然後通過瀏覽器的下載功能下載。

let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
let image = new Image();
image.onload = function() {
  canvas.width = image.width;
  canvas.height = image.height;
  ctx.drawImage(image, 0, 0);
  let base64 = canvas.toDataURL();
  let a = document.createElement("a");
  a.href = base64;
  a.download = "example.png";
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}
image.src = "example.jpg";

三、JS圖片下載成file

通過AJAX請求後端接口獲取圖片二進制流,然後將二進制流轉換成file對象。

function downloadFile(url) {
  let xhr = new XMLHttpRequest();
  xhr.open("GET", url, true);
  xhr.responseType = "blob";
  xhr.onload = function() {
    if (this.status == 200) {
      let blob = this.response;
      let filename = url.substring(url.lastIndexOf('/') + 1).split("?")[0];
      let a = document.createElement("a");
      a.href = window.URL.createObjectURL(blob);
      a.download = filename;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    }
  }
  xhr.send();
}

調用該函數即可下載:

downloadFile("http://example.com/images/example.png");

四、JS圖片下載直接顯示而不下載

有時候需要將圖片顯示在頁面上,而不是下載到本地。直接將圖片的url作為標籤的src屬性即可。

<img src="http://example.com/images/example.jpg">

五、JS圖片下載不在線看

對於不在線查看的圖片,可以使用canvas將圖片繪製成base64編碼格式,然後顯示在頁面上。但是,需要注意的是對於大圖片會消耗大量的內存,可能會導致頁面卡頓。

let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
let image = new Image();
image.onload = function() {
  canvas.width = image.width;
  canvas.height = image.height;
  ctx.drawImage(image, 0, 0);
  let base64 = canvas.toDataURL();
  let img = document.createElement("img");
  img.src = base64;
  document.body.appendChild(img);
}
image.src = "example.jpg";

六、JS圖片下載完顯示到頁面

有時候需要將下載後的圖片顯示在頁面上。這時候可以將圖片的url作為標籤的src屬性,或者使用canvas將圖片繪製到頁面上。

方法一:

let img = new Image();
img.onload = function() {
  document.body.appendChild(img);
}
img.src = "example.jpg";

方法二:

let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
let image = new Image();
image.onload = function() {
  canvas.width = image.width;
  canvas.height = image.height;
  ctx.drawImage(image, 0, 0);
  let img = new Image();
  img.src = canvas.toDataURL();
  document.body.appendChild(img);
}
image.src = "example.jpg";

七、JS圖片下載有token的可下載

有些情況下需要使用token進行權限驗證後才能下載圖片。可以使用AJAX請求後端接口獲取圖片二進制流,然後將二進制流轉換成file對象。

function downloadFileWithToken(url, token) {
  let xhr = new XMLHttpRequest();
  xhr.open("GET", url, true);
  xhr.setRequestHeader("Authorization", "Bearer " + token);
  xhr.responseType = "blob";
  xhr.onload = function() {
    if (this.status == 200) {
      let blob = this.response;
      let filename = url.substring(url.lastIndexOf('/') + 1).split("?")[0];
      let a = document.createElement("a");
      a.href = window.URL.createObjectURL(blob);
      a.download = filename;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    }
  }
  xhr.send();
}

調用該函數即可下載:

downloadFileWithToken("http://example.com/images/example.png", "xxx-xxx-xxx-xxx");

八、用JS下載圖片流

可以通過AJAX請求後端接口獲取圖片二進制流,然後將二進制流轉換成base64編碼格式,最後將base64編碼格式的字符串轉為Blob對象,實現下載圖片流。

function downloadImageStream(url) {
  let xhr = new XMLHttpRequest();
  xhr.open("GET", url, true);
  xhr.responseType = "blob";
  xhr.onload = function() {
    if (this.status == 200) {
      let blob = this.response;
      let reader = new FileReader();
      reader.readAsDataURL(blob);
      reader.onloadend = function() {
        let base64data = reader.result;
        let array = base64data.split(",");
        let mime = array[0].match(/:(.*?);/)[1];
        let bstr = atob(array[1]);
        let n = bstr.length;
        let u8arr = new Uint8Array(n);
        while(n--) {
          u8arr[n] = bstr.charCodeAt(n);
        }
        let blobObj = new Blob([u8arr], {type: mime});
        let downloadUrl = window.URL.createObjectURL(blobObj);
        let a = document.createElement("a");
        a.style.display = "none";
        a.href = downloadUrl;
        a.download = url.substring(url.lastIndexOf('/') + 1).split("?")[0];
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(downloadUrl);
        document.body.removeChild(a);
      }
    }
  }
  xhr.send();
}

調用該函數即可下載:

downloadImageStream("http://example.com/images/example.jpg");

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/296283.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-27 12:58
下一篇 2024-12-27 12:58

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • 打包後頁面空白的解決方案

    當我們在調試階段時,我們的app可能看起來完美無缺,但當我們進行打包時,在運行app時,我們可能會遇到白屏或空白的問題。在這篇文章中,我們將探討如何解決這種問題。 一、檢查文件路徑…

    編程 2025-04-29
  • JWT驗證Token的實現

    本文將從以下幾個方面對JWT驗證Token進行詳細的闡述,包括:JWT概述、JWT驗證Token的意義、JWT驗證Token的過程、JWT驗證Token的代碼實現、JWT驗證Tok…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • Python操作Web頁面

    本文將從多個方面詳細介紹Python操作Web頁面的技巧、方法和注意事項。 一、安裝必要的庫 在Python中操作Web頁面,需要用到一些第三方庫。 pip install req…

    編程 2025-04-28
  • JS圖片沿着SVG路徑移動實現方法

    本文將為大家詳細介紹如何使用JS實現圖片沿着SVG路徑移動的效果,包括路徑製作、路徑效果、以及實現代碼等內容。 一、路徑製作 路徑的製作,我們需要使用到SVG,SVG是可縮放矢量圖…

    編程 2025-04-27
  • 如何通過knife4j設置全局token

    本文將介紹如何在使用knife4j作為接口文檔管理工具時,通過設置全局token來提高接口文檔的安全性。 一、什麼是knife4j Knife4j是一款基於springfox的開源…

    編程 2025-04-27
  • 如何使用JS調用Python腳本

    本文將詳細介紹通過JS調用Python腳本的方法,包括使用Node.js、Python shell、child_process等三種方法,以及在Web應用中的應用。 一、使用Nod…

    編程 2025-04-27

發表回復

登錄後才能評論