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 分号引起的一段调试问题
Jun 18 Javascript
csdn 博客中实现运行代码功能实现
Aug 29 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
javascript实现动态表头及表列的展现方法
Jul 14 Javascript
js实现创建删除html元素小结
Sep 30 Javascript
jQuery validate插件实现ajax验证重复的2种方法
Jan 22 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
Jan 13 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
Feb 15 Javascript
bootstrap table 多选框分页保留示例代码
Mar 08 Javascript
浅谈React的最大亮点之虚拟DOM
May 29 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
Apr 28 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程序员应该了解MongoDB的五件事
2013/06/03 PHP
php实现水仙花数示例分享
2014/04/03 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
jQuery实现日历效果
2020/09/11 jQuery
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
django使用admin站点上传图片的实例
2019/07/28 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
前台文员岗位职责及工作流程
2013/11/19 职场文书
自主招生自荐书
2013/11/29 职场文书
我未来的职业规划范文
2014/01/11 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
党员公开承诺事项
2014/03/25 职场文书
继承公证书样本
2014/04/04 职场文书
教室布置标语
2014/06/26 职场文书
篮球社团活动总结
2014/06/27 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
三峡导游词
2015/01/31 职场文书
民事起诉状范文
2015/05/19 职场文书
拉贝日记观后感
2015/06/05 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
Python中异常处理用法
2021/11/27 Python
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server