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 相关文章推荐
jQuery-ui中自动完成实现方法
Jun 10 Javascript
网页从弹窗页面单选框传值至父页面代码分享
Sep 29 Javascript
谈谈JavaScript异步函数发展历程
Sep 29 Javascript
jQuery 常用代码集锦(必看篇)
May 16 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
Jul 10 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
Aug 17 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
Sep 19 Javascript
微信小程序合法域名配置方法
May 06 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 26 Javascript
vue Element左侧无限级菜单实现
Jun 10 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
Jan 25 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
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
PHP实现的简单mock json脚本分享
2015/02/10 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
微信小程序日期选择器实例代码
2018/07/18 Javascript
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
详解python中的线程
2018/02/10 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
旷课检讨书3000字
2014/02/04 职场文书
英文自荐信常用句子
2014/03/26 职场文书
感恩教育活动总结
2014/05/05 职场文书
工程款申请报告
2015/05/15 职场文书
高二语文教学反思
2016/02/16 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
导游词之江西赣州
2019/10/15 职场文书
Feign调用全局异常处理解决方案
2021/06/24 Java/Android