九牛娱乐网
音乐播放器
JavaScript 如何下载图片

我们在浏览器使用JavaScript下载图片的时候;通常会想到使用window.location.href=imgUrl或者window.open(imgUrl);但是有时候我们会发现图片会在浏览器打开;而达不到我们想要的下载效果;于是通过调研;下面总结了两种图片下载的方法

前置代码

下载图片前首先在JavaScript通过new Image()的方式加载图片;然后再对图片做转换,转换包括图片转base64,base64转blob等;然后对转换之后的图片资源进行下载。下面直接上代码。

// 加载图片
async function loadImage (params) {
  // 图片src 必传
  let src = params.src
  return new Promise((resolve, reject) => {
    let img = new Image()
    img.src = src
    img.crossOrigin = 'anonymous'
    img.onload = () => {
      resolve(img)
    }
    img.onerror = reject
  })
}

// 图片转base64
function img2Base64 (image) {
  // 图片画到canvas
  const canvas = document.createElement('canvas');
  canvas.width = image.width;
  canvas.height = image.height;
  const context = canvas.getContext('2d');
  context.drawImage(image, 0, 0);
  return canvas.toDataURL('image/png', 1.0)
}
// base64转blob
function base64ToBlob (base64Code) {
  let parts = base64Code.split(';base64,')
  let contentType = parts[0].split(':')[1]
  let raw = window.atob(parts[1])
  let rawLength = raw.length
  let uInt8Array = new Uint8Array(rawLength)
  for (let i = 0; i < rawLength; ++i) {
    uInt8Array[i] = raw.charCodeAt(i)
  }
  return new Blob([uInt8Array], {
    type: contentType
  })
}

// 下载资源
function downloadFile(href, filename) {
  const link = document.createElement('a');
  link.href = href;
  link.download = filename;
  link.setAttribute('type', 'application/octet-stream');
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

下载图片代码

方法一;先加载图片,再把图片转base64,再下载base64。

方法二;先加载图片,再把图片转base64,再把base64转blob,再下载blob。

// 1;先加载图片,再把图片转base64,再下载base64
async function downloadImg1(imageUrl) {
  const image = await loadImage({src: imageUrl})
  let base64 = img2Base64(image)
  // 下载图片
  downloadFile(base64, 'file.png');
}
// 2;先加载图片,再把图片转base64,再把base64转blob,再下载blob
async function downloadImg2(imageUrl) {
  const image = await loadImage({src: imageUrl})
  let base64 = img2Base64(image)
  let blob = base64ToBlob(base64)
  // 下载图片
  downloadFile(URL.createObjectURL(blob), 'file.png');
}

// 示例
downloadImg1('https://xyhnnx.gitee.io/img/getdoc.png');
downloadImg2('https://xyhnnx.gitee.io/img/getdoc.png');

可能遇到的报错

如果遇到这个错误:Access to image at 'xx' from origin 'xx' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.这个错误提示通常是由于遵循同源策略而引起的,它防止JavaScript代码从不同的源(域名、协议或端口)获取数据。如果试图从另一个域名下加载图像,即在跨域请求图片时,由于CORS限制,浏览器可能会拒绝显示该图像并抛出这个错误。

要解决这个问题,您可以使用下面的任一方法:

  1. 将图像文件存放在与您的网站相同的主机上,或者使用基于相对路径的URL。这将避免跨域问题。

  2. 如果必须从不同的域名或主机加载图像,您需要在相关的服务器上设置Access-Control-Allow-Origin标头,在响应中包含允许访问资源的域名。例如,在HTTP响应中添加以下标头可以允许所有域名访问图片:Access-Control-Allow-Origin: *

如果您无法在服务器上进行更改,可以尝试使用代理来获取图像数据。例如,您可以在您的服务器上设置代理,在代理中请求图像,而不是直接从浏览器中请求。这将避免跨域问题。

总之,CORS问题通常涉及到服务器、响应头或代理,您可以根据实际情况选择相应的解决方案来解决这个问题。

附件/图片

附件图片
打赏列表 共 0 金币

暂无打赏记录,快来成为第一个打赏的人吧!

回复

全部评论 (0)

暂无评论,来发表第一条评论吧!

发表评论

剩余 100 字符