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 相关文章推荐
JavaScript Prototype对象
Jan 07 Javascript
JavaScript Event学习第九章 鼠标事件
Feb 08 Javascript
JavaScript cookie的设置获取删除详解
Feb 11 Javascript
jQuery实现带有洗牌效果的动画分页实例
Aug 31 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
May 17 Javascript
JS实现颜色梯度与渐变效果完整实例
Dec 30 Javascript
vue.js+Element实现表格里的增删改查
Jan 18 Javascript
angular和BootStrap3实现购物车功能
Jan 25 Javascript
knockoutjs模板实现树形结构列表
Jul 31 Javascript
Node.js中sequelize时区的配置方法
Dec 10 Javascript
vue axios请求拦截实例代码
Mar 29 Javascript
react 中父组件与子组件双向绑定问题
May 20 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中mt_rand()随机数函数用法
2014/11/24 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
Python3实现转换Image图片格式
2018/06/21 Python
详解numpy的argmax的具体使用
2019/05/27 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
python自动化办公操作PPT的实现
2021/02/05 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
年度安全生产目标责任书
2014/07/23 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
元旦标语大全
2014/10/09 职场文书
归元寺导游词
2015/02/06 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
Nginx HTTP跳转至HTTPS
2022/05/15 Servers
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript