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 相关文章推荐
Grid得到选择行数据的方法总结
Jan 17 Javascript
Javascript拓展String方法小结
Jul 08 Javascript
ECMAScript6中Set/WeakSet详解
Jun 12 Javascript
javascript实现自动输出文本(打字特效)
Aug 27 Javascript
Node.js的Web模板引擎ejs的入门使用教程
Jun 06 Javascript
JS+Canvas绘制动态时钟效果
Nov 10 Javascript
jQuery实现左右滑动的toggle方法
Mar 03 jQuery
Javascript实现时间倒计时功能
Nov 17 Javascript
小程序实现悬浮搜索框
Jul 12 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 Javascript
js实现tab栏切换效果
Aug 02 Javascript
在js文件中引入(调用)另一个js文件的三种方法
Sep 11 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
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
javascript 多浏览器 事件大全
2010/03/23 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
python实现神经网络感知器算法
2017/12/20 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
pygame实现非图片按钮效果
2019/10/29 Python
python装饰器原理与用法深入详解
2019/12/19 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
社会实践心得体会
2014/01/03 职场文书
餐厅考勤管理制度
2014/01/28 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
博士生专家推荐信
2015/03/25 职场文书