作者:harmsworth2016
來(lái)源:CSDN
原文:https://blog.csdn.net/harmsworth2016/article/details/84492581
版權(quán)聲明:本文為博主原創(chuàng)文章淌哟,轉(zhuǎn)載請(qǐng)附上博文鏈接帚戳!
前言
圖片是最常見(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
// 圖片下載對(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è)試')