使用a标签进行下载

 <a href="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png">下载</a>

出现的问题

如果使用a标签指向一个图片,
你会发现点击链接时它会直接在浏览器中打开图片并显示.
并不是下载到本地,与我们的初衷相违背
我们应该如何去解决这个问题了。

尝试了将图片转成Base64或者Blob的办法

function downloadImgByBlob(url) {
var img = new Image()
img.onload = function() {
var canvas = document.createElement('canvas')
canvas.width = img.width
canvas.height = img.height
var ctx = canvas.getContext('2d')
// 将img中的内容画到画布上
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
// 将画布内容转换为Blob
canvas.toBlob((blob) => {
// blob转为同源url
var blobUrl = window.URL.createObjectURL(blob)
// 创建a链接
var a = document.createElement('a')
a.href = blobUrl
a.download = ''
// 触发a链接点击事件,浏览器开始下载文件
a.click()
})
}
img.src = url
// 必须设置,否则canvas中的内容无法转换为blob
img.setAttribute('crossOrigin', 'Anonymous')
} function downloadImgByBase64(url) {
var img = new Image()
img.onload = function() {
var canvas = document.createElement('canvas')
canvas.width = img.width
canvas.height = img.height
var ctx = canvas.getContext('2d')
// 将img中的内容画到画布上
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
// 将画布内容转换为base64
var base64 = canvas.toDataURL()
// 创建a链接
var a = document.createElement('a')
a.href = base64
a.download = ''
// 触发a链接点击事件,浏览器开始下载文件
a.click()
}
img.src = url
// 必须设置,否则canvas中的内容无法转换为base64
img.setAttribute('crossOrigin', 'Anonymous')
}

出现的问题

上述两种方法效果都不太理想。因为这两种方法仅支持生成jpeg和png格式图片。如果是gif图,仅能显示第一帧的内容

通过XMLHttpRequest()请求图片链接

<button @click="myFileDownLoad"> 下载</button>

myFileDownLoad(){
var x=new XMLHttpRequest();
x.open("GET", "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1986179278,1118313821&fm=27&gp=0.jpg", true);
x.responseType = 'blob';
x.onload=function(){
var url = window.URL.createObjectURL(x.response)
var a = document.createElement('a');
a.href = url
a.download = '你的下载'
a.click()
}
x.send();
}
该示例的思路是,通过XMLHttpRequest()请求图片链接,然后获取返回的Blob。那结合上面下载图片的方法,就能下载图片了:
通过这种方法下载图片,gif图也能够显示正常了。
注意,上述方法能够兼容大部分浏览器,但是不兼容IE浏览器(不支持download属性)。要兼容IE浏览器需要用其他办法。
下载的链接好像要是https的才行 (我下载的都是https的图片) ps:语法
objectURL = URL.createObjectURL(object);
参数object;用于创建 URL 的 File 对象、Blob 对象或者 MediaSource(媒体资源) 对象。
返回值:该URL可用于指定源 object的内容

文件下载 既可以下载图片又可以任意文件类型[xls,word,mp4]

function downLoad(item) {
//filePathUrl是一个https的地址哈。
if (item.filePathUrl) {
// 下载https的图片
let fileType = item.fileName.split('.').pop()
let canDownFileType = ['jpg', 'png', 'gif', 'webp', 'jpeg']
if (canDownFileType.indexOf(fileType) != -1) {
// 下载的是图片
var x = new XMLHttpRequest()
x.open('GET', item.filePathUrl, true)
x.responseType = 'blob'
x.onload = function (e) {
var url = window.URL.createObjectURL(x.response)
var a = document.createElement('a')
a.href = url
a.download = item.fileName //图片的下载名称
a.click()
}
x.send()
} else {
// // 下载的是文件类型的,
var url = item.filePathUrl
var xhr = new XMLHttpRequest()
xhr.open('GET', url, true)
xhr.responseType = 'blob'
xhr.onload = function () {
if (xhr.status === 200) {
var blob = xhr.response
var link = document.createElement('a')
var body: any = document.querySelector('body')
link.href = window.URL.createObjectURL(blob)
link.download = item.fileName
link.style.display = 'none'
body.appendChild(link)
link.click()
body.removeChild(link)
}
}
xhr.send()
}
} else {
window.$message.error('资源地址不存在')
}
}

继续优化可以通过http下载任意文件

function downLoad = (url, item) => {
var xhr = new XMLHttpRequest()
xhr.open('GET', url, true)
xhr.responseType = 'blob'
xhr.onload = function () {
if (xhr.status === 200) {
var blob = xhr.response
var link = document.createElement('a')
var body: any = document.querySelector('body')
link.href = window.URL.createObjectURL(blob)
link.download = item.name
link.style.display = 'none'
body.appendChild(link)
link.click()
body.removeChild(link)
}
}
xhr.send()
}

任意文件下载包含https的图片的更多相关文章

  1. phpmyadmin任意文件包含漏洞分析(含演示)

    0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...

  2. [CVE-2014-8959] phpmyadmin任意文件包含漏洞分析

    0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...

  3. PHP代码审计笔记--任意文件下载漏洞

    在文件下载操作中,文件名及路径由客户端传入的参数控制,并且未进行有效的过滤,导致用户可恶意下载任意文件.  0x01 客户端下载 常见于系统中存在文件(附件/文档等资源)下载的地方. 漏洞示例代码: ...

  4. Mlecms 反射型xss && 后台任意文件下载

    应该算0day吧,自己分析出来的,有点鸡肋,不过小cms分析确实比较简单. xss地址:search.php?word=a><img+src=1+onerror=alert`1`>a ...

  5. 【代码审计】EasySNS_V1.6 前台任意文件下载漏洞分析

      0x00 环境准备 EasySNS官网:http://www.imzaker.com/ 网站源码版本:EasySNS极简社区V1.60 程序源码下载:http://es.imzaker.com/i ...

  6. 【代码审计】CLTPHP_v5.5.3后台任意文件下载漏洞分析

      0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chich ...

  7. 代码审计-(Ear Music).任意文件下载漏洞

    0x01 代码分析 后台地址:192.168.5.176/admin.php admin admin 安装后的界面 在后台发布了一首新歌后,前台点进去到一个“下载LRC歌词”功能点的时候发现是使用re ...

  8. ThinkCMF X1.6.0-X2.2.3框架任意内容包含漏洞分析复现

    ThinkCMF X1.6.0-X2.2.3框架任意内容包含漏洞分析复现 一.ThinkCMF简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理系统框架,底层采用ThinkPHP3. ...

  9. ThinkCMF 框架上的任意内容包含漏洞

    0x01  背景 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建. ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者 ...

  10. ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)

    1.漏洞概述 攻击者可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的 2.影响版本 ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X ...

随机推荐

  1. Jenkins Pipeline 流水线 - 上传文件 Publish over SSH 执行命令

    Jenkins Pipeline 流水线 - 上传文件 Publish over SSH 执行命令 Jenkins插件安装 Publish over SSH 系统配置 生成代码 sshPublishe ...

  2. python sorted排序小结

    转载至: https://blog.csdn.net/ray_up/article/details/42084863 在python中排序有两个专用函数,一个是sort,另一个sorted.其中sor ...

  3. 【django-vue】登录、注册前端实现 redis介绍 redis安装 python操作redis redis连接池 Redis之字符串类型

    目录 上节回顾 今日内容 1 登录前台 多方式登录 短信登录 Login.vue 2 注册前台 注册功能 Header.vue 3 redis介绍 3.1 redis应用场景 3.2 redis安装 ...

  4. Multisim 14 免费破解版,下载安装教程,2023年亲测可用,永久激活

    Multisim是一款功能强大.操作流畅的专业仿真工具,适用于板级模拟/数字电路板设计工作,提供电路原理图图形输入.电路硬件描述语言输入,具有丰富的仿真分析能力.拥有专业版和教学版,深受国内外教师.科 ...

  5. AliSSR 语音超分算法:让在线会议语音更明亮更自然

    超分让在线会议语音更明亮,在线会议已成为日常工作中较为普遍的沟通交流方式,接入会议的方式也呈现多样化,比如电脑入会.手机入会又或是电话入会. 雪雅.曜辰|作者 众所周知,高采样率且高带宽的音频信号富含 ...

  6. JSP使用MySQL数据库报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    错误 在JavaWeb中的JSP中使用MySQL数据库报错找不到 com.mysql.jdbc.Driver . 错误日志如下: java.lang.ClassNotFoundException: c ...

  7. Codeforce 1288C. Two Arrays(DP组合数学,n个数选择m个数,单调不递减个数,排列组合打表N*N)

    https://codeforces.com/problemset/problem/1288/C Examples input 2 2 output 5 input 10 1 output 55 in ...

  8. Round A 2021 - Kick Start 2021

    比赛链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000436140 K-Goodness String (5 ...

  9. vivo 应用商店推荐系统探索与实践

    介绍 vivo 应用商店推荐系统如何高效支撑个性化的推荐需求. 一.前言 商店的应用数据主要来源于运营排期.CPD.游戏.算法等渠道,成立推荐项目之后也没有变化,发生变化的是由推荐系统负责和数据源进行 ...

  10. Clickhouse执行处理查询语句(包括DDL,DML)的过程

    Clickhouse执行处理查询语句(包括DDL,DML)的过程 总体过程 启动线程处理客户端接入的TCP连接: 接收请求数据,交给函数executeQueryImpl()处理: executeQue ...