javascript使用链接跨域下载图片


Posted in Javascript onNovember 01, 2019

前言

图片是最常见的静态资源文件,可以从本地、外链获取图片,或者使用base64码展示。而canvas的toDataUrl() API可以将图片转base64码,然后模拟点击事件即可下载图片。

外链下载

在本地或者网站下载外链url图片时涉及到跨域,跨域会暴露自己的隐私,浏览器对跨域请求进行了限制,故需要设置crossOrigin为anonymous来允许跨域,浏览器会为这张图片的请求头附带Origin信息,告诉静态资源服务器,请在响应头中附带Access-Control-Allow-Methods、Access-Control-Allow-Origin,以便浏览器放行。

代码示例如下

eventEmitter.js

/*
 * 事件触发器
 * @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'
// 图片下载对象
let downloadedImg = null
// 待下载文件名
let fileName = null

// 监听是否获取图片地址
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标签模拟下载
 * @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', '测试')

注意

若有跨域的错误提示出现,则需后台服务器进行跨域设置。

javascript使用链接跨域下载图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js Dialog 实践分享
Oct 22 Javascript
js快速排序的实现代码
Dec 08 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
Vue.js对象转换实例
Jun 07 Javascript
vue语法之拼接字符串的示例代码
Oct 25 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 jQuery
在vscode里使用.vue代码模板的方法
Apr 28 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
Nov 05 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 Javascript
vue + typescript + 极验登录验证的实现方法
Jun 27 Javascript
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
JavaScript架构localStorage特殊场景下二次封装操作
Jun 21 Javascript
async/await让异步操作同步执行的方法详解
Nov 01 #Javascript
浅谈Three.js截图并下载的大坑
Nov 01 #Javascript
vue中使用vee-validator完成表单校验方案
Nov 01 #Javascript
解决vue的过渡动画无法正常实现问题
Oct 31 #Javascript
VUE单页面切换动画代码(全网最好的切换效果)
Oct 31 #Javascript
js new Date()实例测试
Oct 31 #Javascript
一起写一个即插即用的Vue Loading插件实现
Oct 31 #Javascript
You might like
怎么使 Mysql 数据同步
2006/10/09 PHP
什么是MVC,好东西啊
2007/05/03 PHP
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
Django model 中设置联合约束和联合索引的方法
2019/08/06 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python:slice与indices的用法
2019/11/25 Python
python3正则模块re的使用方法详解
2020/02/11 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
优秀教师工作感言
2014/02/16 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
倡议书格式
2014/08/30 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
Java详细解析==和equals的区别
2022/04/07 Java/Android