<a>标签下载download 浏览器打开文件或者下载文件的区别

在这里插入图片描述
用户点击下载多媒体文件(图片/视频等),最简单的方式:

<a href='url' download="filename.ext">下载</a>

如果url指向同源资源,是正常的。

如果url指向第三方资源,download会失效,表现和不使用download时一致——浏览器能打开的文件,浏览器会直接打开,不能打开的文件,会直接下载。浏览器打开的文件,可以手动下载。

解决方案一:将文件打包为.zip/.rar等浏览器不能打开的文件下载。

解决方案二:通过后端转发,后端请求第三方资源,返回给前端,前端使用file-saver等工具保存文件。

如果url指向的第三方资源配置了CORS,download依然无效,但可以通过xhr请求获取文件,然后下载到本地。

浏览器已经限制死跨域下载多媒体文件的各种方式。

/**
 * 用FileSave保存文件
 * @param url
 */
export function downloadUrlFile(url) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.responseType = 'blob';
  xhr.setRequestHeader('Authorization', 'Basic a2VybWl0Omtlcm1pdA==');
  xhr.onload = () => {
    if (xhr.status === 200) {
      // 获取图片blob数据并保存
      saveAs(xhr.response, 'abc.jpg');
    }
  };
 
  xhr.send();
}
 
/**
 * URL方式保存文件到本地
 * @param name 文件名
 * @param data 文件的数据
 */
function save(name, data) {
	var urlObject = window.URL || window.webkitURL || window;
	var export_blob = new Blob([data]);
	var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
	save_link.href = urlObject.createObjectURL(export_blob);
	save_link.download = name;
	_fakeClick(save_link);
}

项目中使用a标签render为下载链接
let loc = window.location.origin // 当前网址和端口号 本地调试时可以下载
在本地开前端然后链接到项目服务器let loc = 'http://10.102.32.72:8080' , 跨域访问时就变为浏览器打开文件
在这里插入图片描述
在这里插入图片描述

	tableColumns: [
        {title: '应用名称', key: 'name'},
        {title: '图名称', key: 'graphName'},
        {title: '用户名', key: 'username'},
        {
          title: '执行状态',
          key: 'appStatus',
          render: (h, params) => {
            const row = params.row
            const text = this.getDescriptionByStatus(row.appStatus)
            const color = ['PENDING', 'RUNNING', 'CONFIGURING', 'COMPLETING'].indexOf(row.appStatus) !== -1 ? 'success' : 'warning'
            return h('Tag', {
              props: {
                type: 'dot',
                color: color
              }
            }, text)
          }
        },
        {title: '更新时间', key: 'updateTime'},
        {
          title: '数据文件',
          key: 'dataFile',
          render: (h, params) => {
            let loc = window.location.origin // 当前网址和端口号
            // let loc = 'http://10.102.32.72:8080'
            // console.log(loc)
            let dataUrlPre = loc + '/' + params.row.username + '/app_result/' + params.row.id
            let dataFiles = Object.keys(params.row.appResultVOMap) // 获取到所有的数据文件名称 ["test.json", "test2.json", "test3.txt"]
            console.log('dataFiles=', dataFiles)
            if (dataFiles.length) {
              return h('ul', dataFiles.map(function (item) {
                let text = ''
                if (item.indexOf('.json') !== -1) {
                  text = item.split('.json')[0]
                } else {
                  text = item.split('.txt')[0]
                }
                let urlDown = dataUrlPre + '/' + text + '/' + item
                console.log('urlDown=', urlDown)
                return h('li', [
                  h('a', {
                    domProps: {
                      href: urlDown,
                      download: item,
                      target: '_black'
                    },
                    style: {
                      marginBottom: '5px',
                      marginTop: '5px',
                      display: 'inline-block',
                      borderBottom: 'solid 1px blue'
                    }
                  }, item)
                ])
              }))
            } else {
              return h('p', '无数据')
            }
          }
        }]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值