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中的prototype与面向对象的实例讲解
May 22 Javascript
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
Mar 05 Javascript
Javascript验证方法大全
Sep 21 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
Vue使用json-server进行后端数据模拟功能
Apr 17 Javascript
JavaScript时间日期操作实例小结【5个示例】
Dec 22 Javascript
React中this丢失的四种解决方法
Mar 12 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
May 30 Javascript
js实现的在本地预览图片功能示例
Nov 09 Javascript
Angular封装表单控件及思想总结
Dec 11 Javascript
jQuery实现简单聊天室
Feb 08 jQuery
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,不用COM,生成excel文件
2006/10/09 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
vue实现分页加载效果
2019/12/24 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
vuex管理状态仓库使用详解
2020/07/29 Javascript
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
python实现人机五子棋
2020/03/25 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
基于python实现删除指定文件类型
2020/07/21 Python
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
水污染治理专业毕业生推荐信
2013/11/14 职场文书
安全知识竞赛主持词
2015/06/30 职场文书
校运会通讯稿
2015/07/18 职场文书
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记