javascript使用鏈接跨域下載圖片
前言
圖片是最常見(jiàn)的靜態(tài)資源文件,可以從本地、外鏈獲取圖片,或者使用base64碼展示。而canvas的toDataUrl() API可以將圖片轉(zhuǎn)base64碼,然后模擬點(diǎn)擊事件即可下載圖片。
外鏈下載
在本地或者網(wǎng)站下載外鏈url圖片時(shí)涉及到跨域,跨域會(huì)暴露自己的隱私,瀏覽器對(duì)跨域請(qǐng)求進(jìn)行了限制,故需要設(shè)置crossOrigin為anonymous來(lái)允許跨域,瀏覽器會(huì)為這張圖片的請(qǐng)求頭附帶Origin信息,告訴靜態(tài)資源服務(wù)器,請(qǐng)?jiān)陧憫?yīng)頭中附帶Access-Control-Allow-Methods、Access-Control-Allow-Origin,以便瀏覽器放行。
代碼示例如下
eventEmitter.js
/*
* 事件觸發(fā)器
* @Author: wujiang
* @Date: 2018-11-11 22:50:43
* @Last Modified by: wujiang
* @Last Modified time: 2018-11-11 23:39:40
*/
const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter()
export default myEmitter
backend.js
import eventEmitter from './common/eventEmitter'
// 圖片下載對(duì)象
let downloadedImg = null
// 待下載文件名
let fileName = null
// 監(jiān)聽(tīng)是否獲取圖片地址
eventEmitter.addListener('getHref', href => {
imatateDownloadByA(href, fileName)
})
/**
* base64下載圖片(可跨域)
* @param {*} img
* @param {String} filename 文件名
*/
function downloadImg (imgUrl, filename) {
fileName = filename
startDownloadImg(imgUrl, getImgDataUrl)
}
/**
* 開(kāi)始下載圖片之前
* @param {String} imgUrl
* @param {Function} callback
*/
function startDownloadImg (imgUrl, callback) {
let imageURL = imgUrl
downloadedImg = new Image()
downloadedImg.crossOrigin = 'Anonymous'
downloadedImg.src = imageURL
downloadedImg.addEventListener('load', callback, false)
}
/**
* 獲取圖片下載base64字符串
* @param {DOMimg} domimg
*/
function getImgDataUrl () {
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')
const width = downloadedImg.width || downloadedImg.naturalWidth
const height = downloadedImg.height || downloadedImg.naturalHeight
const imgSrc = downloadedImg.src
let type = imgSrc.substring(imgSrc.lastIndexOf('.') + 1)
let dtype = type === 'jpg' ? 'jpeg' : 'png'
canvas.width = width
canvas.height = height
context.drawImage(downloadedImg, 0, 0)
eventEmitter.emit('getHref', canvas.toDataURL(`image/${dtype}`))
}
/**
* 通過(guò)a標(biāo)簽?zāi)M下載
* @param {String} href
* @param {String} filename
*/
function imatateDownloadByA (href, filename) {
const a = document.createElement('a')
a.download = filename
a.style.display = 'none'
a.href = href
document.body.appendChild(a)
a.click()
a.remove()
window.URL.revokeObjectURL(href)
}
downloadImg('https://img.alicdn.com/imgextra/i2/54199406/O1CN012JLzreAxzn1xhNP_!!54199406.jpg', '測(cè)試')
注意
若有跨域的錯(cuò)誤提示出現(xiàn),則需后臺(tái)服務(wù)器進(jìn)行跨域設(shè)置。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS實(shí)現(xiàn)仿Windows經(jīng)典風(fēng)格的選項(xiàng)卡Tab切換代碼
這篇文章主要介紹了JS實(shí)現(xiàn)仿Windows經(jīng)典風(fēng)格的選項(xiàng)卡Tab切換代碼,涉及JavaScript元素的遍歷與樣式的修改技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
JavaScript的String字符串對(duì)象常用操作總結(jié)
String對(duì)象用于存儲(chǔ)字符串?dāng)?shù)據(jù),這里我們做了JavaScript的String字符串對(duì)象常用操作總結(jié),需要的朋友可以參考下2016-05-05
BootStrap使用popover插件實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)顯示并保持顯示框
這篇文章主要介紹了BootStrap使用popover插件實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)顯示并保持顯示框的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
Bootstrap 網(wǎng)格系統(tǒng)布局詳解
在平面設(shè)計(jì)中,網(wǎng)格是一種由一系列用于組織內(nèi)容的相交的直線(垂直的、水平的)組成的結(jié)構(gòu)(通常是二維的)。這篇文章主要介紹了Bootstrap 網(wǎng)格系統(tǒng)布局,需要的朋友可以參考下2017-03-03
JavaScript數(shù)組和對(duì)象的復(fù)制
本篇文章主要介紹了JavaScript數(shù)組和對(duì)象的復(fù)制的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
JavaScript Generator函數(shù)使用分析
生成器Generator是JavaScript ES6引入的特性,它讓我們可以分段執(zhí)行一個(gè)函數(shù)。但是在談?wù)撋善鳎℅enerator)之前,我們要先了解迭代器Iterator2022-10-10
JavaScript正則表達(dá)式匹配 div style標(biāo)簽
這篇文章主要介紹了JavaScript正則表達(dá)式匹配<div><style>標(biāo)簽 的相關(guān)資料,需要的朋友可以參考下2016-03-03
JavaScript開(kāi)發(fā)的七個(gè)實(shí)用小技巧(很有用)
日常開(kāi)發(fā)中,我們經(jīng)常需要編寫(xiě)大量的js代碼,下面這篇文章主要給大家介紹了關(guān)于JavaScript開(kāi)發(fā)的七個(gè)實(shí)用小技巧,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04

