js 下载文件/图片

最近做了一个类似element的上传组件,顺带写了文件下载功能,遇到了一点小问题。

在网上看了很多文章,大多人给出的方法只用了a标签,虽设了download属性,也只是预览 而不是下载,具体原因我没有仔细研究,这里把我成功的方法贴出来,供参考。

解决方式: 把下载a标签 放到axios中,需要使用到插件:axios

注意:

1. 如果图片是线上链接或其他格式,需要转化成blob形式。

2. 下载状态:上一次下载没有成功,最好在按钮上设置状态,控制不要开始下一次下载

代码实现

首先准备好axios,responseType: 'blob'这个是很重要的属性,一定要加

let url = '这个是你将要下载的图片地址'
axios.get(url, {
    responseType: 'blob',
}).then(res => {
    // 后续的代码都是放到这个位置
})

第一步:把下载地址转换成 blob

let blob = new Blob([url]);

第二步:创建URL

 let objectUrl = URL.createObjectURL(blob) // 创建URL

第三步:创建a标签

let a = document.createElement('a');
a.href = objectUrl;
a.download = `文件下载名.后缀`
document.body.appendChild(a)

第四步:主动触发a标签点击事件

let event = new MouseEvent('click')
a.dispatchEvent(event)

// 点击后移除a标签
setTimeout(() => {
    document.body.removeChild(link)
}, 500)

年纪大了,记性不中用,记录下我的代码,方便自己回忆 😅

data () {
    return { canAjax: true }   // 是否可以下载
}

handleDownLoad ({ rawFile, index }) {
    if ( this.canAjax ) {
        this.canAjax = false;

        // 获取要下载的文件 【着是我自己代码的逻辑,跟下载没关系哦】
        const file = this.getFile(rawFile);
        // url 图片下载地址
        let url = file.response && file.response.data && file.response.data.url || '';

        axios.get(url, {
            responseType: 'blob',
        }).then(res => {

            this.canAjax = true

            let blob = new Blob([res.data]);
            let objectUrl = URL.createObjectURL(blob) // 创建URL

            // 创建a标签
            let link = document.createElement('a');
            link.href = objectUrl;
            link.download = `${file.name}`
            document.body.appendChild(link)

            // 给a标签增加点击事件
            let event = new MouseEvent('click')
            link.dispatchEvent(event)
            setTimeout(() => {
                document.body.removeChild(link)
            }, 500)

        }).catch(() => {
            this.canAjax = true
        })
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值