Vue a标签实现点击下载,下载图片、txt文件,不是直接打开的方式

news/2024/7/10 1:33:26 标签: vue, js

前段时间在项目中遇到文件需要下载,直接拿出了之前封装的下载指令,在用的时候发现在下载jpg、txt文件时,并不会直接下载,而是会在浏览器中打开文件,即使给a标签添加了download
属性,也无济于事。
我先把之前封装的指令贴出来吧,如果下载文件类型只是Exact、Word、Pdf格式的可以直接拿着用,如果有其他文件类型需求的,可以继续往文章下面看

  • 支持Exact、Word、Pdf格式下载
let baseDownloadUrl = 'https://xxxxx.cn'  // 域名
// 添加自定义v-down指令
Vue.directive('down', {
	inserted: (el, binding) => {
		el.style.cssText = 'cursor: pointer;color:red;'
		el.addEventListener('click', () => {
			console.log(binding.value)
			let link = document.createElement('a')  // 创建a标签
			link.style.display = 'none'
			link.href = baseDownloadUrl + binding.value // 设置下载地址
			link.setAttribute('download', '') // 添加downLoad属性
			document.body.appendChild(link)
			link.click()
		})
	}
})

Vue页面中使用指令v-down

<span v-down="item.Url">(附件)</span>
  • 当下载文件中存在jpg、txt等浏览器可以直接预览的文件时,上面的方法就会出现问题,即使加了download仍然会在浏览器中打开下载文件
    我们可以将下载地址借助Blob转换成二进制,然后,作为a标签的href属性,配合download属性,实现下载。
    具体实现代码如下:
Vue.directive('down', {
  inserted: (el, binding) => {
    el.style.cssText = 'cursor: pointer;color:write;'
    el.addEventListener('click', () => {
      console.log(binding.value)
      let link = document.createElement('a')
      let url = baseDownloadUrl + binding.value
      // 这里是将url转成blob地址,
      fetch(url).then(res => res.blob()).then(blob => { // 将链接地址字符内容转变成blob地址
        link.href = URL.createObjectURL(blob)
        console.log(link.href)
        link.download = ''
        document.body.appendChild(link)
        link.click()
      })
    })
  }
})

Vue页面中使用指令v-down

<span v-down="item.Url">(附件)</span>

上面的这种方法,也只是将上面的方法略做调整,将地址进行了转化,从而实现对jpg、txt 文件的下载,若有更好的办法请各位大佬指点。

如果是在做导出功能,请求头需要携带token的话,可以参考我的另外一篇文章https://blog.csdn.net/lhz_19/article/details/105784299
更多文章__> >> 码砖猿的技术博客


http://www.niftyadmin.cn/n/875707.html

相关文章

uni-app实现列表的上拉加载,下拉刷新、回到顶部功能

在使用uni-app做app和小程序时&#xff0c;经常会遇到一些列表&#xff0c;这个时候就需要列表能够实现上拉加载更多、下拉刷新的功能&#xff0c;具体效果如下&#xff1a; 此功能比较简单&#xff0c;就不过多介绍了直上代码&#xff1a; HTML部分 // 活动列表<view c…

nodejs+nginx获取真实ip,解决获取ip为127.0.0.1的问题

nodejsnginx获取真实ip,解决获取ip为127.0.0.1的问题 访问互联网上的服务时&#xff0c;大多数时&#xff0c;客户端并不是直接访问到服务端的&#xff0c;而是客户端首先请求到反向代理&#xff0c;反向代理再转发到服务端实现服务访问&#xff0c;通过反向代理实现路由/负载…

react监听页面滚动事件:window.addEventListener的scroll无效

react监听页面滚动事件&#xff1a;window.addEventListener的scroll无效 在react项目中需要通过监听页面滚动高度&#xff0c;控制页面样式动态展示&#xff0c;所以在网上找了以后其他案例发现监听无效&#xff0c;代码如下&#xff1a; //在componentDidMount&#xff0c;…

基于vue的图片剪裁工具vue-croppe

基于vue的图片剪裁工具vue-croppe 安装 // npm安装 npm install --save vue-croppa // yarn 安装 yarn add vue-croppa使用 引入插件 两种引用方式 // 全局注册 main.js import VueCropper from vue-cropper Vue.use(VueCropper)// 组件内单独使用 userAvatar.vue import { …

vue实现一键复制

在个人项目中为了更好的完善体验&#xff0c;需要有一个一键复制的功能复制&#xff0c;主要的实现方法有以下几个&#xff1a; 不使用插件 使用input配合document.execComman方法可以实现&#xff1b; 这个特性已经过时了&#xff0c;它在一些浏览器中仍然可以工作&#xff…

基于element封装table、分页

在利用element-ui Table编写项目时,会存在表格展示的数据存在分页的情况,基本每个页面都要配置&#xff0c;很影响开发效率&#xff0c;也不利于后期维护&#xff0c;所以统一封装一下&#xff0c;便于开发使用。 How to Use: 在src/components目录中创建base-table&#xff0…

vue自定义音频audio样式及操作面板

简介 由于audio标签原生样式不能满足项目需要&#xff0c;需要自定义样式&#xff0c;项目使用技术为vue&#xff0c;将自定义audio封装为一个组件&#xff0c;可以在其他组件内进行引用,主要进行了以下修改&#xff1a; 1、隐藏原生audio标签 2、通过div实现自定义样式 3、控…

常见的数据埋点方式介绍

首先我们要先了解数据埋点&#xff0c;到底有什么用处&#xff1f; 1、对设计师而言 根据埋点统计出页面元素的点击&#xff0c;页面按钮的点击转化&#xff0c;有助于在后续中作进一步视觉调优。 2、对产品/运营/推广而言 可作为产品/运营/推广当次产品功能/运营活动/渠道推广…