逻辑_文件下载(a标签的download属性)

需求描述
  • 需求:当点击按钮时,可以下载模板文件,下载地址如下
    https://file2.clipworks.com/4c217acc09226795a7ebb8461ddf548f/20220726/469c1056-749d-4c47-819e-35f91c70e163
    
实现过程
实现代码
<div>
    <a 
      class="el-button el-button--primary el-button--mini"
      href='https://file2.clipworks.com/4c217acc09226795a7ebb8461ddf548f/20220726/469c1056-749d-4c47-819e-35f91c70e163' 
      download="视频教程模板"
    >
      模板下载
    </a>
</div>
  • a标签样式采用的是elementUI中按钮的样式
问题

​ 按照如上代码,当点击按钮时并不会下载文件而是进行页面跳转(跳转到当前url)!

原因

若是href属性值为远程url,则具有同源策略,只有同源的url才会进行文件下载,若是不同源不会下载而是跳转!

解决

href属性值为远程url才会存在同源策略,我们可以创建一个本地url进行下载。

  • 原生js

    <div>
      <button id="btn">模板下载</button>
    </div>
    <script>
      const btn = document.getElementById('btn')
      btn.onclick = function(){
        const xhr = new XMLHttpRequest()
        xhr.open('get','https://file2.clipworks.com/4c217acc09226795a7ebb8461ddf548f/20220726/469c1056-749d-4c47-819e-35f91c70e163')
        xhr.responseType='blob'
        xhr.send()
        xhr.onload = function(){
          // 1. 根据远程URL创建本地url
          const localUrl = URL.createObjectURL(xhr.response)
          // 2. 创建a标签,并点击下载文件
          const linka = document.createElement('a')
          linka.setAttribute('href', localUrl)
          linka.setAttribute('download', '视频教程模板')
          linka.click()
          // 3.清除工作
          URL.revokeObjectURL(localUrl) // 清除创建的本地url
        }
      }
    </script>
    
  • vue中

    <template>
      <div style="margin-top:20px">
        <a class="el-button el-button--primary el-button--mini" :href='url' download="视频教程模板" id='downloadBtn' target='_blank'>模板下载</a>
      </div>
    </template>
    
    <script>
      export default {
        data(){
          return{
            url:undefined
          }
        },
        created(){
          this.getLocalUrl()
        },
        methods:{
          getLocalUrl(){
            // 根据远程url创建本地url
            const url = 'https://file2.clipworks.com/4c217acc09226795a7ebb8461ddf548f/20220726/469c1056-749d-4c47-819e-35f91c70e163'
            const xhr = new XMLHttpRequest()
            xhr.open('GET', url)
            xhr.responseType = "blob"
            xhr.onload = ()=>{
              this.url = URL.createObjectURL(xhr.response)
            }
            xhr.onerror = e =>{
              console.log('err', e)
            }
            xhr.send()
          }
        }
      }
    </script>
    
知识点
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中通过点击a标签进行文件下载的方法是使用a标签的href属性来指定文件的地址,并在a标签中添加download属性。例如: ```html <a href="具体的文件的地址" download>点击下载文件</a> ``` 这样当用户点击该链接时,浏览器会自动下载该文件到本地。 在Vue项目中,可以通过在模板中添加上述代码来实现点击a标签下载文件的功能。同时,你也可以在Vue的methods中定义一个方法,在该方法中执行文件下载逻辑,并通过点击按钮来触发该方法。例如: ```html <template> <div> <button @click="downloadFile">点击下载文件</button> </div> </template> <script> export default { methods: { downloadFile() { // 执行文件下载逻辑 // 可以使用window.location.href或者axios等库来实现文件下载 } } } </script> ``` 在downloadFile方法中,你可以使用window.location.href来直接下载文件,或者使用axios等库发送请求来下载文件。这样当用户点击按钮时,就会执行文件下载逻辑。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [前端Vue项目中点击a标签实现下载文件到本地的功能](https://blog.csdn.net/AiGarry/article/details/124289858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Vue:a标签点击和file-saver/FileSaver.js实现文件下载](https://blog.csdn.net/mouday/article/details/111958466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vue实现点击按钮下载文件功能](https://download.csdn.net/download/weixin_38636763/14828985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值