Vue实现下载文件而非浏览器直接打开的方法

 更新时间:2023年05月25日 15:54:17   作者:FENGYU406  
对于浏览器来说,文本、图片等可以直接打开的文件,不会进行自动下载,下面这篇文章主要给大家介绍了关于Vue实现下载文件而非浏览器直接打开的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

问题背景

对于一个txt文本、图片、视频、音频等浏览器可以直接使用浏览器进行预览的文件,使用传统的a标签加download属性进行下载是行不通的,会在浏览器直接打开,因此需要搞一个新的方式进行下载。

实现流程

实现思路

这里使用Vue自定义指令,对文件链接进行处理,将链接转化为blob进行下载,Vue2和Vue3在写法上有所区别。

定义指令

在src目录中,新建存放所有自定义指令的目录directive,然后新建vdown.js并编写指令:

指令脚本位置

Vue2写法:

import Vue from "vue";
Vue.directive('down', {
  inserted: (el, binding) => {
    el.addEventListener('click', () => {
      let link = document.createElement('a')
      let url = 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()
      })
    })
  }
})

Vue3写法:

let vdown = {
    mounted: (el, binding) => {
        el.addEventListener('click', () => {
            console.log(binding.value)
            let link = document.createElement('a')
            let url = binding.value
            // 这里是将url转成blob地址,
            console.log(url)
            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()
            })
        })
    }
}
export default vdown

指令中使用fetch获取文件内容,并转换为blob,然后通过构造的A标签模拟点击进行下载。

注册指令

在Vue2写法中,已经使用Vue.directive注册了指令,所以直接在main中引入自定义指令的脚本文件即可:

...
import '@/directive/vdonw'
...

而在Vue3写法中,定义指令的脚本中只是定义了指令的内容而未注册,所以需要在main中进行注册:

Vue3写法:

import { createApp } from 'vue'
import App from './App.vue'
var app = createApp(App)
// 注册指令
import vdown from '@/directive/vdown'
app.directive('down', vdown)
// 注册结束
app.mount('#app')

使用指令

在Vue文件中,直接定义下载按钮,添加v-down指令并传递要下载的URL,即可完成下载:

...
<a v-down="'http://127.0.0.1:8888/file.txt'">下载文件</a>
...

跨域问题

若遇到跨域问题,配置proxy代理解决即可,在vue.config.js中添加如下内容:

module.exports = {
    devServer: {
        proxy: {
            '/serverfile': {
                target: 'http://www.xxx.com',//这里后台的地址模拟的;应该填写你们真实的后台接口
                ws: true,
                changOrigin: true,//允许跨域
                pathRewrite: {
                    '^/serverfile': '/'//请求的时候使用这个api就可以
                }
            }
        }
    }
}

修改下载按钮中的连接:

...
<a v-down="'/serverfile/file.txt'">下载文件</a>
...

然后点击下载即可成功下载:

文件下载

总结

到此这篇关于Vue实现下载文件而非浏览器直接打开的文章就介绍到这了,更多相关Vue下载文件非浏览器打开内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何在 ant 的table中实现图片的渲染操作

    如何在 ant 的table中实现图片的渲染操作

    这篇文章主要介绍了如何在 ant 的table中实现图片的渲染操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • vue实现指定区域自由拖拽、打印功能

    vue实现指定区域自由拖拽、打印功能

    这篇文章主要为大家详细介绍了vue实现指定区域自由拖拽、打印功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue之Dep和Observer的用法及说明

    Vue之Dep和Observer的用法及说明

    这篇文章主要介绍了Vue之Dep和Observer的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • vue环形进度条组件实例应用

    vue环形进度条组件实例应用

    在本文中我们给大家分享了关于vue环形进度条组件的使用方法以及实例代码,需要的朋友们跟着测试下吧。
    2018-10-10
  • vue中的vue-router query方式和params方式详解

    vue中的vue-router query方式和params方式详解

    这篇文章主要介绍了vue中的vue-router query方式和params方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue.js删除列表中的一行

    vue.js删除列表中的一行

    这篇文章给大家分享了vue.js删除列表中的一行的实例操作以及代码分享,有兴趣的朋友参考下。
    2018-06-06
  • vue项目自适应屏幕分辨率实现步骤

    vue项目自适应屏幕分辨率实现步骤

    这篇文章主要给大家介绍了关于vue项目自适应屏幕分辨率实现的相关资料,作为前端人员,为了适配各种型号的电脑、手机,我们往往离不开屏幕分辨率的适配,需要的朋友可以参考下
    2023-09-09
  • Vue项目报错:parseComponent问题及解决

    Vue项目报错:parseComponent问题及解决

    这篇文章主要介绍了Vue项目报错:parseComponent问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue指令v-html使用过滤器filters功能实例

    vue指令v-html使用过滤器filters功能实例

    在本篇文章里我们给大家整理的是关于vue指令v-html使用过滤器filters功能的实例内容,需要的朋友们学习下。
    2019-10-10
  • 解决antd 表单设置默认值initialValue后验证失效的问题

    解决antd 表单设置默认值initialValue后验证失效的问题

    这篇文章主要介绍了解决antd 表单设置默认值initialValue后验证失效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论