javascript使用鏈接跨域下載圖片
前言
圖片是最常見的靜態(tài)資源文件,可以從本地、外鏈獲取圖片,或者使用base64碼展示。而canvas的toDataUrl() API可以將圖片轉(zhuǎn)base64碼,然后模擬點(diǎn)擊事件即可下載圖片。
外鏈下載
在本地或者網(wǎng)站下載外鏈url圖片時(shí)涉及到跨域,跨域會(huì)暴露自己的隱私,瀏覽器對(duì)跨域請(qǐng)求進(jìn)行了限制,故需要設(shè)置crossOrigin為anonymous來允許跨域,瀏覽器會(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)聽是否獲取圖片地址 eventEmitter.addListener('getHref', href => { imatateDownloadByA(href, fileName) }) /** * base64下載圖片(可跨域) * @param {*} img * @param {String} filename 文件名 */ function downloadImg (imgUrl, filename) { fileName = filename startDownloadImg(imgUrl, getImgDataUrl) } /** * 開始下載圖片之前 * @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}`)) } /** * 通過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)文章
javaScript實(shí)現(xiàn)網(wǎng)頁版的彈球游戲
這篇文章主要為大家詳細(xì)介紹了javaScript實(shí)現(xiàn)網(wǎng)頁版的彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07javascript forEach函數(shù)實(shí)現(xiàn)代碼
在Base2中找到一個(gè)叫forEach的函數(shù),是我見過的最好的實(shí)現(xiàn)。挖出來分析一下。它能對(duì)各種普通對(duì)象,字符串,數(shù)組以及類數(shù)組進(jìn)行遍歷。如果原游覽器的對(duì)象已實(shí)現(xiàn)此函數(shù),它則調(diào)用原對(duì)象的函數(shù)。2010-01-01Javascript實(shí)現(xiàn)計(jì)算個(gè)人所得稅
用javascript腳本語言編寫一個(gè)“個(gè)人所得稅計(jì)算器”?計(jì)算公式:所得稅=(月收入-起征額)*10%;重填就是全部清空;十分的實(shí)用,有需要的小伙伴可以參考下。2015-05-05一文搞懂JSON(JavaScript Object Notation)
Json 有兩種基本的結(jié)構(gòu),即 Json對(duì)象 和 Json 數(shù)組。通過 Json 對(duì)象和 Json 數(shù)組這兩種結(jié)構(gòu)的組合可以表示各種復(fù)雜的結(jié)構(gòu),今天通過本文給大家介紹JavaScript Object Notation的基本知識(shí),感興趣的朋友一起看看吧2021-10-10