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

发表回复

登录后才能评论